ในแบบฝึกหัดสุดท้ายนี้ คุณจะได้ผลลัพธ์จาก DSP สำหรับค่าอินพุท ที่ถูกกำหนดโดย test vector จากนั้นจะทำการเปรียบเทียบผลลัพธ์ที่ได้จาก DSP กับผลลัพธ์ที่ได้จากการ ทำ MATLAB simulation ของ filter processing โดยใช้ อินพุทเดียวกัน ถ้า DSP ถูก implement อย่างถูกต้องผลลัพธ์ที่ได้จะใกล้เคียงหรืออาจจะเท่ากัน เพื่อที่จะทำการทดสอบดังกล่าว ให้คุณสร้างกราฟคลื่นขึ้นใน MATLAB จากนั้นให้บันทึกเป็น test vector จากนั้นให้ทำการประมวลผล DSP filter โดยใช้ test vector ดังกล่าวเป็น input เมื่อเสร็จแล้วให้ทำการ import ผลลัพธ์เข้าไปใน MATLAB เพื่อเปรียบเทียบผล
ขั้นตอนแรกในการใช้ test vector ก็คือการสร้างสัญญาณอินพุทที่เหมาะสม ทางหนึ่งที่สามารถทำได้คือ การใช้ฟังก์ชัน sweep (available as sweep.m) ที่เคลื่อนที่ข้ามช่วงของความถี่ จากนั้นให้ใช้ฟังก์ชัน
save_test_vector (available as save_test_vector.m ให้ทำการบันทึกใส่ในไฟล์ที่จะนำไปใช้ต่อในส่วนของการทำ DSP
สร้าง sinusoid sweep และทำการบันทึกให้เป็น DSP test vector ไฟล์ด้วยคำสั่งต่อไปนี้:
>> t=sweep(0.1*pi,0.9*pi,0.25,500); % Generate a frequency sweep
>> save_test_vector('testvect.asm',t); % Save the test vector
จากนั้นให้ใช้คำสั่ง conv ของ MATLAB ในการจำลองผลของการทำ filter sweep ด้วย filter
h
h
ที่คุณสร้างขึ้นด้วยคำสั่ง gen_filt ก่อนหน้านี้ ให้สังเกตว่านี่เป็นขั้นตอนในการสร้างเวคเตอร์ที่มีขนาด 507 (โดยที่
n+m−1
n
m
1
, where
n
n คือ ขนาดของ filter และ
m
m คือขนาดของ input) คุณควรจะเก็บแค่ 500 element แรกในเวคเตอร์ผลลัพธ์
>> out=conv(h,t) % Filter t with FIR filter h
>> out=out(1:500) % Keep first 500 elements of out
ในตอนนี้ให้ทำการแก้ไขในไฟล์ filter.asm เพื่อที่จะใช้ “test_vector” จาก core file vectcore.asm. แทนที่จะรับข้อมูลจาก A/D converter แล้วส่งข้อมูลผลลัพธ์ไปให้ D/A Core file จะรับ input และบันทึก output ไปที่หน่วยความจำของ DSP โดยที่ test vector นั้นจะถูกเก็บอยู่ที่ evaluation board ของ DSP ซึ่งจะไม่ยุ่งเกี่ยวกับในส่วนของโปรแกรมและข้อมูลอื่น
ใน memory block ที่ใช้เก็บ test vector นั้นมีขนาดใหญ่พอที่จะเก็บเวคเตอร์ที่มีขนาดใหญ่ถึง 4000 element โดยจะเก็บtest vector ทั้งสำหรับอินพุทและ เอาท์พุททั้ง 6 channels
ในการประมวลผลโปรแกรมสำหรับ test vector นี้ จะต้องไปทำการแก้ filter.asm. โดย assembly source นั้นเป็นเพียง text ไฟล์ ที่คุณสามารถทำการ edit ได้โดยใช้ editor ตามที่คุณต้องการ เช่น WordPad, Emacs, และ VI โดยทำการแก้ที่บรรทัดแรกของไฟล์จาก
ให้เป็น:
.copy "testvect.asm"
.copy "vectcore.asm"
ให้สังเกตว่าข้างหน้าของ
.copy นั้นจะต้องใส่ directive
การเปลี่ยนแปลงนี้จะส่งผลกับ test vector ที่คุณสร้างขึ้นและสามารถเลือกใช้ core ไฟล์ตามที่ต้องการ หลังจากที่ทำการแก้ไข code เสร็จเรียบร้อยแล้วให้ทำการ assemble , โหลด แล้วรันไฟล์โดยใช้ Code Composer เหมือนก่อนหน้านี้ หลังจากผ่านไป 2-3 วินาที ให้ทำการ หยุดการทำงานของ DSP (ใช้คำสั่ง Halt ที่อยู่ภายใต้
Debug menu) จากนั้นให้ตรวจดูว่า DSP ได้หยุดทำงานที่ branch statement ที่ branch ไปที่ตัวของมันเอง จากหน้าจอ disassembly window บรรทัด: 0000:611F F073 B 611fh จะถูก highlight
จากนั้นให้ทำการบันทึก test output ไฟล์แล้วทำการโหลดกลับเข้าสู่ MATLAB ซึ่งสามารถทำได้โดยการบันทึก 3,000 memory element ( 6 channels คูณด้วย 500 samples) โดยเริ่มที่ตำแหน่ง 0x8000 iในหน่วยความจำของโปรแกรม ทำได้โดยเลือก File->Data->Save... ที่อยู่ใน Code Composer Studio ให้ใส่ชื่อไฟล์เป็น
output.dat แล้วกด Enter
จากนั้นให้ใส่ค่า 0x8000 ในช่อง Address field ของ Dialog Box ที่แสดงขึ้น, ใส่ 3000 ในช่อง Length field ให้เลือก Program จาก drop-down menu ถัดไปที่ Page ทุกครั้งที่ทำการบันทึกผลลัพธ์ต้องตรวจดูว่าได้ใส่ length ที่ถูกต้อง ( 6 คูณด้วยขนาดของ test vector)
ขั้นสุดท้าย ให้ใช้คำสั่ง read_vector (available as read_vector.m) เป็นคำสั่งที่ใช้ในการอ่านผลลัพธ์ที่บันทึกอยู่ใน MATLAB สามารถทำได้โดยพิมพ์คำสั่งต่อไปนี้:
>> [ch1, ch2] = read_vector('output.dat');
ตอนนี้ผลที่ได้คือ ch1 จะเป็นค่า test_vector ที่ผ่านการ filter ของ test signal ที่คุณสร้างขึ้น ในขณะที่ ch2 นั้นควรจะใกล้เคียงหรือเหมือนกับ ch1 เป็นผลลัพธ์ที่ได้จาก DSP
การที่ ch2 และ ch1ไม่เหมือนกันนั้นเป็นเพราะ quantization error ในการบันทึก test vector สำหรับ หน่วยความจำแบบ 16-bit
หลังจากที่ทำการโหลดผลลัพธ์ของการกรอง (calculated as
out above) เพื่อทำการเปรียบเทียบผลกับ (in
ch1 from above). เรายังสามารถนำผลลัพธ์ที่ได้มาสร้างกราฟเพื่อดูเปรียบเทียบ ซึ่งสามารถทำได้ดังนี้:
>> plot(out,'r'); % Plot the expected curve in red
>> hold on % Plot the next plot on top of this one
>> plot(ch1,'g'); % Plot the expected curve in green
>> hold off
คุณจะต้องตรวจให้แน่ใจว่าผลลัพธ์ทั้งสองนั้นต่างกันเกือบเป็นศูนย์ ซึ่งสามารถทำได้ด้วยการสร้างกราฟผลต่างของทั้งสองเวคเตอร์:
>> plot(out-ch1); % Plot error signal
Yคุณจะพบว่าผลลัพธ์ทั้งสองออกมาต่างกันก็เพราะ DSP ใช้ 16-bit precision ในการคำนวณ ในขณะที่ MATLAB ใช้ 64-bit floating point numbers for its arithmetic
ให้สังเกตว่าการเปรียบเทียบสองเวคเตอร์ด้วยวิธีนี้นั้น เวคเตอร์ทั้งสองควรจะมีขนาดเท่ากันซึ่งสามารถกำหนดได้จากคำสั่งใน MATLAB out=out(1:500)
above.