Summary: You will implement band-pass finite impulse-response (FIR) filters with time-domain processing.
ในแบบผึกหัดนี้ จะสอนวิธีการเขียน FIR filter โดยการใช้ภาษาแอสแซมบลีของ DSP เริ่มต้นจากแอสแซมบลีพื้นฐานที่ใช้เขียน FIR filter จากไฟล์ filter.asm.
| filter.asm |
|---|
|
filter.asm จะทำการใช้ FIR filter กับอินพุต channel ที่ 1 แล้วทำการส่งผลลัพธ์ที่ได้ไปยัง channel ที่ 1 พร้อมกับส่ง อินพุตที่ไปยัง channel ที่ 2
ลำดับแรก สร้าง workin directory ของคุณขึ้นที่ network drive สำหรับไฟล์ที่จะใช้ในแบบฝึกหัดนี้ จากนั้นทำการ copy filter.asm
และ core.asm
ไปไว้ใน directory ที่สร้างขึ้น เสร็จแล้วให้ใช้ MATLAB สร้าง 20-tap FIR
filter 2 อัน filter ตัวแรก ควรผ่านสัญญาณที่มีความถี่ ตั้งแต่ 4 kHz ถึง 8 kHz; ส่วน filter ตัวที่สอง ให้ ผ่านสัญญาณความถี่ 8 kHz ถึง 12 kHz
สำหรับ filter ทั้งสอตัว ให้ใช้ 1 kHz transition band ที่ทุกริมของ filter passband ในการสร้าง filter พวกนี้ ควรจะแปลง band edge ให้เป็น
สัญญาณดิจิตอล โดยเทียบจาก 44.1 kHz
sample rate ของระบบ จากนั้นให้ใช้คำสั่ง MATLAB
remez ในการสร้าง filter; อาจลองพิมพ์
help remez สำหรับ รายละเอียดของการใช้คำสั่ง และใช้คำสั่ง
save_coefsave filter แต่ละตัวคนละไฟล์ (ตรวจดูก่อน save ว่าได้ทำการกลับเวคเตอร์ ของ filter coef เรียบร้อยแล้ว)
ทำการ save filter ในรูปของ MATLAB matrix ด้วย เพราะคุณจะต้องใช้มันภายหลังในการสร้าง test เวคเตอร์
สารมารถทำได้โดย ใช้คำสั่ง save ใน MATLAB
เมื่อเสร็จเรียบร้อยแล้ว ให้ใช้คำสั่ง freqz
ในการสร้าง frequency response ให้แต่ละ filter
สำหรับตอนนี้คุณจะทำการ implement แค่ filter ที่ใช้ 4 kHz ถึง 8
kHz passband เท่านั้น. แก้ไข filter.asm เพื่อใช้ coefficient สำหรับ filter ตัวนี้
อย่างแรก เราจะใช้ FIR filter ขนาด 20 ไม่ใช่ 8 ในแบบฝึกหัดนี้
ฉะนั้นคุณจะต้องเปลี่ยน FIR_len เป็น
20. FIR_len โดยใช้ directive .set
ซึ่งสามารถ set ค่า ได้โดย assign ค่าตัวเลขให้ FIR_len .set 20.
ขั้นที่สอง, คุณจะต้องแน่ใจว่า .copy
directive copy ค่า coefficients ที่ถูกต้อง. เปลี่ยนชื่อไฟล์ เป็นชื่อไฟล์ที่เก็บค่า
ของ coefficients ที่ใช้สำหรับ filter ตัวแรก
จากนั้นให้ทำการแก้ไข .align และ
.space directives ต่างๆ ตามความเหมาะสม. TI
TMS320C54x DSP ต้องใช้ circular buffers, เพื่อใช้สำหรับ
FIR filter coefficient และ state buffers, ซึ่งถูก set ให้ตรงกัน
โดยให้ address เริ่มต้น เป็นค่ายกำลังสอง
so that they begin at an address that is a multiple of a power
of two greater than the length of the buffer. Since you are
using a 20-tap filter (ซึ่งใช้ 20-element state และ
coefficient บัฟเฟอร์), the next greater power of two is 32.
ฉะนั้นคุณจะต้องทำการตั้งค่า address ของทั้ง state และ coefficient
บัฟเฟอร์ เป็นจำนวนเท่าของ 32
(16-element บัฟเฟอร์จะต้องถูกตั้งค่าให้เป็นจำนวนเท่าของ 32 เช่นกัน)
ซึ่งสามารถทำได้โดยใช้คำสั่ง .align นอกจากนี้หน่วยความจำยัง
ต้องถูกจองไว้ให้ state บัฟเฟอร์ด้วย ทำได้ โดยใช้ directive
.space ซึ่งจะรับจำนวน bits
ของเนื้อที่ทที่ต้องการ . ฉะนั้นถ้าต้องการ เนื้อที่ 20 word จะต้องใช้
directive .space 16*20 ดังตัวอย่างข้างใต้
1 .align 32 % Align to a multiple of 32
2 coef .copy "filter1.asm" % Copy FIR filter coefficients
3
4 .align 32 % Align to a multiple of 32
5 state .space 16*20 % Allocate 20 words of data space
แก้ไข code, ตั้งค่า PMST เป็น
0xFFE0, reset DSP, แล้ว run. ตรวจดูว่า ค่าความถี่ที่ตอกลับ
มานั้นถูกต้อง หลังจากที่แน่ใจว่า code ทำงานได้ถูกต้องแล้ว ให้เริ่มขั้นต่อไป
ขั้นแรก, ให้สร้าง copy ของ filter.asm ที่ถูกทำการแก้ไข
เรียบร้อยแล้ว จากไฟล์ Part 1.
ใช้ไฟล์นี้ในการทำงาน อย่าทำการแก้ไข filter ที่ใช้ก่อนหน้านี้ เพราะจะมี
การใช้ filter ตัวเดิมอีกในภายหลัง
จากนั้น, ทำการแก้ไข code เพื่อที่จะทำการส่ง output ไปที่ filter ตัวแรก
(ด้วย passband 4 kHz ถึง 8 kHz ) ที่ output channel 1 แล้วoutput ที่ไม่ได้ผ่าน
filter ไปยัง output channel 2, ส่ง output จาก filter ตัวที่สอง
(ด้วย passband 8 kHz ถึง12 kHz ) ไปยัง output channel 3.
เพื่อนที่จะทำงานได้ดังที่กล่าว คุณจะต้องใช้ .align และ
.copy คำสั่งในการ load ชุดของ coefficients ชุดที่สอง
ไปยัง data memory. นอกจากนี้จะต้องเพิ่มคำสั่ง เพื่อ initialize ค่าของ
pointer ให้ชี้ไปยัง coefficients ชุดที่สอง และคำนวณค่าให้ filter ตัวที่สอง
คุณสามารถ implement dual-channel system โดยไม่ใช้ auxiliary registers
AR4 และ AR5 ได้หรือไม่ ?
ทำไมมันถึงยากกว่าปกติ ? การเปลี่ยนชื่อ AR4 และ AR5
โดยใช้ .asg ถือว่าไม่นับ!
การใช้เทคนิคที่กล่าวถึงใน DSP Development Environment: Introductory Exercise for TI TMS320C54x, เพื่อนสร้าง test vector และ output ที่ต้องการ ที่เหมาะสมใน MATLAB. และการใช้ test-vector core file ที่อ้างอิงจาก DSP Development Environment: Introductory Exercise for TI TMS320C54x, หาผลลัพธ์จากระบบโดยการใช้ test vector นี้ ใน MATLAB ให้ทำการสร้างกราฟจากผลลัพธ์จริงและผลัพธ์ที่คาดว่าน่าจะเกิด จากทั้งสอง filter และ ผลต่างจากผลลัพธ์ทั้งสอง ทำไมผลลัพธ์ที่เกิดจาก DSP ถึงไม่เท่ากับผลลัพธ์ที่จาก MATLAB ?
อีกทางเลือกหนึ่งสำหรับการ implementing symmetric FIR filters
โดยใช้คำสั่ง firs instruction. แก้ไข
code จาก Part 1 เพื่อ implement
filter ที่ใช้ passband 4 kHz to 8 kHz โดยใช้ firs.
ข้อแตกต่างสองประการ ในการ implementation ระหว่าง code จาก
Part 1 และ code ที่คุณจะต้องเขียน
สำหรับส่วนนี้ คือ (1) the firs คำสั่งนี้จะทำให้ coefficients
ถูก locate ในส่วนของ program memory แทนที่จะใช้
data memory, และ (2) firs จะทำให้ states
ถูกแยกออกเป็น สอง circular buffer. อ้างอิงจาก firs
คำสั่งบน หน้า 4-59 ใน
คู่มือ Mnemonic Instruction Set [link] ซึ่งมีทั้งคำอธิบายและตัวอย่างการใช้
หน้า 4-5 จนถึง 4-8 ของ Applications
Guide [link] ถ้าหากต้องการข้อมูลเพิ่มเติม (Volumes 2 and
4 respectively of the TMS320C54x DSP Reference
Set).
AR0 ต้องถูกตั้งค่าเป็น -1 เพื่อที่จะให้โปรแกรมทำงานได้ถูกต้อง
ทำไม?
COEFF เป็นตัวระบุว่า coeffients ตัวไหนที่จะถูกโหลดเข้า
ไปใน program memory. อ้างอิงจาก คำอธิบายของ
firs สำหรับข้อมูลเพิ่มเติม).
1 mvdd *AR2,*AR3+0% ; write x(-N/2) over x(-N)
2 sth A,*AR2 ; write x(0) over x(-N/2)
3 add *AR2+0%,*AR3+0%,A ; add x(0) and x(-(N-1))
4 ; (prepare for first multiply)
5
6 rptz B,#(FIR_len/2-1)
7 firs *AR2+0%,*AR3+0%,COEFF
8 mar ??????? ; Fill in these two instructions
9 mar ??????? ; They modify AR2 and AR3.
10
11 ; note that the result is now in the
12 ; B accumulator
เนื่องจากในตอนนี้ states และ coefficients จะถูกนำมาใช้ต่างจาก FIR คราวก่อน, ฉะนั้นจะต้องทำการแก้ไข ค่าตั้งต้นของ pointer
1 stm #(FIR_len/2),BK ; initialize circular buffer length
2 stm #firstate_,AR2 ; initialize location containing first
3 ; half of states
4
5 stm #-1,AR0 ; Initialize AR0 to -1
6
7 stm #firstate2_,AR3 ; initialize location containing last half
ใช้ test-vector ใน ไฟล์หลัก เพื่อหาผลลัพธ์จากระบบ และใช้
test-vector ตัวเดียวกัน ทดสอบกับ two-filter system.
เปรียบเทียบผลลัพธ์ของ filter นี้ กับ filter ที่ถูก implement
โดยใช้ คำสั่งmac ผลลัพธ์เหมือนกันหรือไม่?
ทำไมเหมือนหรือทำไมไม่เหมือน? ตรวจให้แน่ใจว่าผลลัพธ์ถูกส่งไป
ที่ channel 1, และ ผลลัพธ์ที่ไม่ได้ ถูก filter ไปที่ output channel 2.