dsk6416 labs project with ccs v4

36
www.titans.com.vn / www.hlab.com.vn [email protected] Page 1 DSK6416 Labs Project with CCS V4 Appendix 1- Gii thiu vDSK6416 DSP ........................................................................................................... 2- To project vi CCS V4 và liên kết vi phn cng DSK6416 ........................................................ 3- Các bài lab cơ bn sdng CCS V4 vi board DSK6416 ............................................................. Phát mt sóng sine vi bng sine có sn ti DAC ca chip AIC23 .......................................... Giao tiếp vi ngoi vi LED, DIP, FLASH, AIC23 trên board DSK6416 ................................. To mt blc FIR đơn gin và chy trên boardDSK6416 ..................................................... To blc IIR trên board .........................................................................................................

Upload: phuong-tien-hung

Post on 02-Jan-2016

49 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 1

DSK6416 Labs Project with CCS V4

Appendix

1- Giới thiệu về DSK6416 DSP ........................................................................................................... 2- Tạo project với CCS V4 và liên kết với phần cứng DSK6416 ........................................................ 3- Các bài lab cơ bản sử dụng CCS V4 với board DSK6416 .............................................................

• Phát một sóng sine với bảng sine có sẵn tới DAC của chip AIC23 ..........................................

• Giao tiếp với ngoại vi LED, DIP, FLASH, AIC23 trên board DSK6416 .................................

• Tạo một bộ lọc FIR đơn giản và chạy trên boardDSK6416 .....................................................

• Tạo bộ lọc IIR trên board .........................................................................................................

Page 2: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 2

1. Giới thi ệu chung về DSK6416 dsp starter

Thông số chính : • A Texas Instruments TMS320C6713 DSP operating at 225 MHz. • An AIC23 stereo codec • 16 Mbytes of synchronous DRAM • 512 Kbytes of non-volatile Flash memory (256 Kbytes usable in default configuration)

Page 3: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 3

• 4 user accessible LEDs and DIP switches • Software board configuration through registers implemented in CPLD • Configurable boot options • Standard expansion connectors for daughter card use • JTAG emulation through on-board JTAG emulator with USB host interface or external emulator • Single voltage power supply (+5V) ------------------------------------------------------------------------------------------------------------------

Page 4: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 4

2. Hướng dẫn tạo project với CCS4 Bước đầu khởi động chương trình từ shortcut trên desktop. Sau đó vào Menu File ->

New-> CCS Project.

Tại hộp thoại, đặt tên cho project và chọn nơi lưu cho project

Page 5: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 5

Chọn dòng DSP sử dung, cụ thể ở đây là C6000 family Next

->Next

Page 6: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 6

Thiết lập như trong hình và Finish

Page 7: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 7

Thiết lập thuộc tính cho project

Trong mục Include Options, thêm vào các đường dẫn như trong hình.

Page 8: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 8

Các thư mục DSK6416, CSL, bios đi kèm với tài liệu này, chúng ta sẽ copy vào thư mục C:\ProgramFiles\Tesxas Instruments\ Tại mục Predefined Symbols, chúng ta sẽ thêm tên chip sử dụng

Page 9: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 9

Tại mục File Search Path chúng ta thêm các thư viện và đường dẫn chứa các thư viện đó .

Page 10: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 10

Sau khi thiết lập những thứ cần thiết cho một project mới, sau đây sẽ là chương trình xuất ra màn hình Console dòng chữ “Hello World!” Tại menu File ->New chúng ta sẽ thêm một Sources File C

Page 11: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 11

Thêm nội dung vào HelloWorld.c Sau đó tiến hành Build Active Project

Page 12: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 12

Màn hình xuất hiện thông báo lỗi về stack, để khắc phục chúng ta sẽ làm như sau:

Page 13: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 13

Sau đó chúng ta sẽ Rebuild lại, kết quả thu được như sau:

Tiếp theo chúng ta sẽ tạo một file dsk6416_HelloWorld.ccsxml, đây là file được dung để liên kết với board DSK6416.

Page 14: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 14

Page 15: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 15

Công việc cuối cùng, chúng ta sẽ kết nối board DSK6416 với PC thông qua một cable USB. Sau đó tiến hành chạy thử.

Và đây là kết quả thu được:

Page 16: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 16

3. Các bài thí nghiệm cơ bản chạy trên CCSV4. 3.1. Tạo một sóng sine, vẽ đồ thị minh họa và output ra ngoài DAC của AIC23.

Tạo một project theo hướng dẫn phía trên và thêm vào các file cần thiết:

Copy đoạn code này vào hàm file main.c

/* * Program creat a new sine wave output to both cha nnels * Creator : Chu Manh Cuong * Date: 19/8/2011 * Fs = 8Khz * Hardware: DSK6416 board * Software: CCSV4 Texas Texas Instruments */ #include <stdio.h> #include <dsk6416_aic23.h> Uint32 fs=DSK6416_AIC23_FREQ_8KHZ; //set sampling rate //set gain short gain = 10; //creat sine wave table short _sine_wave[8]={0,707,1000,707,0,-707,-1000,-707}; //sine values short output_buffer[8]; void main() { Uint16 i,j; comm_poll(); //init DSK, codec, McBSP while(1) { for(i=0;i<8;i++) { output_buffer[i] = _sine_wave[i]*gain; output_sample(output_buffer[i]); } } }

Page 17: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 17

Kết nối board DSK6416 với PC thông qua cable USB , sau đó vào Target-> Debug Active project.

Kết nối headphone hoặc speaker (loa) tới outout trên boar, nhấn vào nút Run và nghe âm thanh được phát ra.

Uint32 fs=DSK6416_AIC23_FREQ_8KHz là tần số lấy mẫu được thiết lập cho DAC AIC23, cụ thể ở đây tần số lấy mẫu là 8KHz. Commpoll() là khai báo board DSK6416, khởi động AIC23 và giao tiếp giữa DSP6416 với AIC23. _sine_wave[8] là bảng sóng sine được quy định sẵn các giá trị đã được lấy mẫu, output_sample() là hàm được gọi ngầm và được khai báo trong file c6416dskinit.h, có chức năng xuất mẫu tới AIC23, chú ý khi khởi tạo project chúng ta phải copy 2 file c6416dskinit.h và c6416dskinit.c tới thư mục chứa project đã tạo.

Page 18: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 18

Mô tả chương trình như sau:

_sine_wave [8] :là một tín hiệu sine rời rạc, khi xuất tới AI23 nó sẽ convert thành tín hiện sine gần giống tướng ứng ở dạng analog. Biến gain là biến độ lợi, làm tăng biên độ giá trị ngõ ra để âm thanh nghe được có biên độ cao hơn. Hàm output_sample() là hàm xuất giá trị rời rạc tới AIC23.

Vẽ đồ thị trong CCSV4 cho project này như sau: sau khi nhấn vào Debug Active project chúng ta vào Tools -> Graph -> Dual Time:

Mô tả thông số chúng a cần quan tâm: Acquisition Buffer Size: kích thước của biến mảng (cụ thể ở đây là 8 byte).

Page 19: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 19

DSP data type : kiểu dữ liệu của biến mảng ( cụ thể ở đây là biến có giá trị là biến nguyên 16bit có dấu). Sampling rate: tần số lấy mẫu (exp: 8KHz). Start Address A: tên của biến mảng thứ nhất. Start Address B: tên của biến mảng thứ hai Display data size: kích thước của dữ liệu cần hiển thị. Ngoài ra các thông số khác chúng ta có thể để mặc định. Sau khi nhấn OK chúng ta thu được : Đồ thị của _sine_wave :

Đồ thị của output_buffer:

Nhìn vào đồ thị chúng ta có thể quan sát thấy rằng, biên độ của sóng sine được xuất ra đã tăng lên gấp 10 lần. Biến đổi FFT cho _sine_wave: Tools - >Graph->FFT Magnitude

Page 20: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 20

.

Một số thông số cần quan tâm: Acquisition Buffer Size, Dsp Data Type, Sampling Rate HZ, Start Address, FFT Order Ngoài ra một số chức năng khác cũng có thể tự tham khảo.

Page 21: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 21

3.2.API giao tiếp với ngoại vi trên board DSK6416 Đi kèm với board mạch DSK6416, chúng ta được nhà sản xuất cung cấp kèm theo các API hỗ trợ cho board để giúp việc giao tiếp ứng dụng trở nên đơn giản hơn, cụ thể đi kèm với board gồm có các file:

Với các hàm API có sẵn chúng ta chỉ việc khai báo và sử dụng chúng.

Ví dụ: Chương trình giao tiếp với LED và DIP trên board:

/* * Interface with LED, DIP on board * Creator : Chu Manh Cuong * Date: 19/8/2011 * Hardware: DSK6416 board * Software: CCSV4 Texas Texas Instruments * */ /Include API library support for board #include <stdio.h> #include <dsk6416_dip.h> #include <dsk6416_led.h> void main() { DSK6416_init(); DSK6416_LED_init(); //init led DSK6416_DIP_init(); //init dip DSK6416_LED_on(0); //on led 0 while(DSK6416_DIP_get(0)); //loop wait for dip0 pressed DSK6416_LED_on(1); //on led 1 DSK6416_LED_off(0); //off led 0 while(1); //stop here }

Page 22: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 22

3.3.Thiết kế bộ lọc FIR trên DSK6416 Như chúng ta đã biết bộ lọc FIR được đặc trưng bởi :

���� = ℎ��� ∗ ���� Với x(n) là tín hiệu ngõ vào, h(n) là đáp ứng xung của bộ lọc, y(n) là tín hiệu ngõ ra sau khi đã được lọc. Để tính tích chập này chúng ta có thể sử dụng một số phương pháp như sau:

Đối với phương pháp xử lý khối chúng ta sẽ sử dụng một số phương pháp sau:

a. Dạng tích chập (convulation) Đây là dạng được dung để tính tích chập trực tiếp và dạng LTI sẽ được tính theo công thức này.

���� = ℎ������� ,�

����

Công thức này sẽ tính tổng tất cả các giá trị h(i)x(j) với i+j = n. Trong phương trình trên i,j phụ thuộc vào đặc tính tự nhiên của bộ lọc và dữ liệu đầu vào là h(n) và x(n).

b. Dạng trực tiếp(direct form)

���� = ℎ������ −�������.��

�������,���� �

Với M là bậc của bộ lọc nhân quả FIR với đáp ứng xung h(i) , i = 0,1,2….M. L là chiều dài của chuỗi dữ liệu ngõ vào (cụ thể là số mẫu ngõ vào). Như vậy khối dữ liệu ngõ ra sẽ có chiều dài như sau:

Ly = L+M Suy ra: 0≤ n ≤L+M-1

c. Dạng tuyến tính bất biến theo thời gian LTI(LTI form)

���� = ����ℎ�� −�������,�� �

�������,����

Với L là chiều dài (sô mẫu) của ngõ vào, M là bậc của bộ lọc có đáp ứng xung h(i),với i= 0,1,2…M.

n = 0,1,2,….L+M-1. Là chiều dài của tín hiệu ngõ ra.

d. Trạng thái thức thời và trạng thái tĩnh.

Page 23: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 23

���� = ℎ������ − ���

���

Với 0≤ n ≤ L – 1.

Đây được xem như là phương trình vào ra I/O cho tất cả bộ lọc FIR bậc M. Nhằm mục đích viết chương trình, người ta sẽ sử dụng công thức b , bởi công thức này không dẫn đến việc vượt quá vùng biên của dãy.

Thực hiện bộ lọc FIR với CCSV4 chạy trên nền DSK6416.

a. Phương pháp xử lý khối (block processing method) Đây là phương pháp xử lý một khối dữ liệu đã có sẵn x(n) và cho ra một khối dữ liệu mới y(n), Với FDA Toolbox của matlab chúng ta sẽ thu được hệ số đáp ứng xung h(n bộ lọc, cụ thể trong phần này sẽ là thiết kế bộ lọc FIR thông thấp (lowpass fir filter) Đây là đáp ưng xung của bộ lọc thu được trên Matlab với các thông số sau:

Specify order: là bậc của bộ lọc Fs : là tần số lấy mẫu Fpass: dải thông Fstop : dải dừng

Áp dụng chạy trên nền chip DSP với board DSK6416 :

Page 24: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 24

Tạo một project mới với các file như trong hình hoặc add project được tạo sẵn đi kèm với tài liệu này chúng ta sẽ có một project như sau:

Sử dụng công thức I/O như sau:

���� = ℎ������ −���

���

Với 0≤ n ≤ L – 1.

Chương trình main:

/* * Project: fir filter base with dsk6416 board * Block processing method * Author : Chu Manh Cuong * Email :[email protected] * Creat date: 24/8/2011 * Board support: DSK6416 TI * Combiner: CCS V4 * */ //include library support #include <stdio.h> #include "dsk6416_aic23.h" #include "HelloWorld.cof" #include <dsk6416_led.h> Uint32 fs=DSK6416_AIC23_FREQ_32KHZ; //set sampling rate //macro function #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b)) //set gain #define GAIN 10 //filter order #define FIL_ORDER 122 //init lenght of input and output #define INPUT_LEN HELLOBUF #define OUTPUT_LEN INPUT_LEN

Page 25: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 25

//include filter coeffciens const short h[FIL_ORDER] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 0, -2, -5, -8, -12, -16, -20, -22, -21, -17, -8, 5, 22, 44, 67, 90, 109, 119, 117, 99, 62, 6, -69, -157, -252, -343, -417, -461, -460, -402, -277, -79, 191, 526, 915, 1339, 1773, 2192, 2568, 2876, 3095, 3208, 3208, 3095, 2876, 2568, 2192, 1773, 1339, 915, 526, 191, -79, -277, -402, -460, -461, -417, -343, -252, -157, -69, 6, 62, 99, 117, 119, 109, 90, 67, 44, 22, 5, -8, -17, -21, -22, -20, -16, -12, -8, -5, -2, 0, 1, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //temp variable for convulution signed long temp; //init output buffer y short y[OUTPUT_LEN]; void main() { int i,n; comm_poll(); //init dsk6416 board and DAC,ADC DSK6416_LED_init(); //LEDs init /*fir filter with block processing method */ for(n=0;n<OUTPUT_LEN;n++) { y[n]=0; temp = 0; for(i=0;i<FIL_ORDER;i++) /*do y[n] la mot bien' short 16bit signed, ma gia t ri khi chung * ta tinh' toan voi phep tich chap phia duoi' s e cho ra gia tri * co kieu bien la signed long, do do chung ta s e tam luu vao bien * temp, sau khi ket thuc phep tich chap, chung ta se tien hanh * giam do loi GAIN de co the dua toi DAC bang p hep tinh tiep theo */ temp += h[i]*(HelloWorld[n-i]); /* * day la phep tinh giam do loi tu` bien' temp */ y[n] = GAIN*(temp/500000); } /* * xuat tat ca input va output de so nhan ra su k hac biet giua input va output * input :truoc khi duoc loc * output: sau khi duoc loc */ for(n=0;n<HELLOBUF;n++) output_sample(HelloWorld[n]); for(n=0;n<OUTPUT_LEN;n++) output_sample(y[n]+2000); return; }

Page 26: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 26

Tiếp theo chúng ta sẽ tiến hành chạy Debug Active project để quan sát chương trình:

Đáp ứng của bộ lọc được vẽ trên CCS:

Phổ tần số input:

Phổ tần số tín hiệu output:

Page 27: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 27

b. Thiết kế bộ lọc FIR thông thấp với phương pháp sample-by-sample Trong phương pháp này, diwx liệu được xử lý từng mẫu ở từng thời điểm qua giải thuật DSP để cho các mẫu ở ngõ ra. Phương pháp này chủ yếu dung trong các ứng dụng thời gian thực như mạch lọc thời gian thực áp dụng cho tín hiệu dài, xử lý các hiệu ứng âm thanh số, các hệ thống điều khiển số, và xử lý tín hiệu thích nghi. Thuật toán xử lý mẫu trực tiếp (sample by sample ) như sau: Cho từng mẫu tín hiệu ngõ vào:

w0 =x y = h0w0 + h1w1 + h2w2+h3w3+…hN-1wN-1 wN-1 = wN-2 wN-2 = wN-3 … w1 = w0

với N là bậc của bộ lọc. Thiết kế một bộ lọc thông thấp với các thông số sau trên Matlab:

Page 28: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 28

Sau khi có được các hệ số bộ lọc từ Matlab, chúng ta sẽ áp dụng qua project của CCS V4. Tạo một project như sau:

Thêm vào chương trình main như sau:

/* * Project: fir filter base with dsk6416 board * Sample by sample * Author : Chu Manh Cuong * Email :[email protected] * Creat date: 24/8/2011 * Board support: DSK6416 TI * Combiner: CCS V4 * */ //include library support #include <stdio.h> #include <dsk6416_aic23.h> #include <dsk6416_led.h> #include <dsk6416_dip.h> Uint32 fs=DSK6416_AIC23_FREQ_96KHZ; //set sampling rate //set gain #define GAIN 10 //filter order #define N 101 //include filter coeffciens const short h[N] = { 1, 0, 0, -1, -2, -3, -6, -8, -12, -16, -22, -28, -36, -44, -53, -63, -72, -82, -91, -99, -105, -109, -110, -107, -99, -86, -66, -40, -7, 34, 83, 140, 205, 278, 357, 443, 534, 629, 727, 826, 924, 1020, 1112, 1199, 1277, 1347, 1406, 1453, 1488, 1509, 1516, 1509, 1488, 1453, 1406, 1347, 1277, 1199, 1112, 1020, 924, 826, 727, 629, 534, 443, 357, 278, 205, 140, 83, 34, -7, -40, -66, -86, -99, -107, -110, -109, -105, -99, -91, -82, -72, -63, -53, -44, -36, -28, -22, -16, -12, -8, -6, -3, -2, -1, 0, 0, 1}; //temp variable for convulution

Page 29: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 29

signed long temp; //init internal buffer short w[N]; //init input x short x; //init output y short y; //short buffer_x[1000]; short buffer_y[N]; void main() { int i,n=0; comm_poll(); //init dsk6416 board and DAC,ADC DSK6416_LED_init(); //LEDs init DSK6416_DIP_init(); for(i=0;i<N;i++) w[i]=0; while(1) { while(DSK6416_DIP_get(0)==0 && DSK6416_DIP_get(3)==1) { DSK6416_LED_on(0); DSK6416_LED_off(3); x = input_sample(); output_sample(x); } while(DSK6416_DIP_get(3)==0 && DSK6416_DIP_get(0)==1) { DSK6416_LED_off(0); DSK6416_LED_on(3); if(n>=N)n=0; else n++; //cap nhat mau~ x = input_sample(); //dua mau~ vao bo dem noi w[0] = x; temp = 0; // buffer_x[n] = x; //tinh ngo ra y for(i=0;i<N;i++) temp += h[i]*w[i]; y = GAIN*(temp/500000); buffer_y[n] = y; //back update for(i=N-1;i>0;i--) w[i] = w[i-1]; //send to DAC output_sample(y); // n++; } } }

Page 30: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 30

Sau đó chúng ta sẽ tiến hành chạy Debug Active project để quan sát hoạt động của chương trình. Chú ý kết nối headphone ,kết nối microphone tới micin trên board, và kết nối một speaker tới một trong 2 kênh output có sẵn trên board DSK6416. Tiến hành chạy, với chương trình này chúng ta có 2 phương dip để chọn tín hiệu ngõ ra, khi dip0 được nhấn (dip0 = 0) thì tín hiệu vào như thế nào và ra như thế, tức là chưa được lọc, và khi dip3 được nhấn (dip3 = 0) thì tín hiệu ngõ ra đã được lọc. Chú ý rằng trong chương trình này, dip3 và dip0 không được đồng thời bằng 0. Đáp ứng xung của bộ lọc:

Phổ tần số input:

Phổ tần số output :

Page 31: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 31

4. Biến đổi DFT Chúng ta sẽ viết một chương trình trên ngôn ngữ C để thực hiện thuật toán DFT, DFT được tính theo công thức sau: N điểm DFT của tín hiệu x(n):

X�"� = ��n�$��%��

���

" = 2'() hoặc. = (./)

N là số điểm DFT. L là kích thước của tín hiệu x(n). Tín hiệu x(n) là một sóng sine . Tạo project trên CCS:

Viết chương trình như sau:

/* * Lab Project: Implement DFT with C program * Author: Chu Manh Cuong * Class: DHDT4TN * Ho Chi Minh University of Industry * Project's name: DFT * Using DSK6416 to run program * Date: 23/9/2011 */ #include <stdio.h> #include <math.h> #include <dsk6416_aic23.h> #include <dsk6416_led.h> #include <dsk6416_dip.h> Uint32 fs = DSK6416_AIC23_FREQ_8KHZ; #define USING_DSK6416 /*setting N point DFT*/ #define N 128 //N point DFT #define L 8 //leght of x #define Fs 8000 //sampling frequency for calculate fk (at fk, magni tude is max) /*creat a sine wave table for example*/ short x[L] = {0,707,1000,707,0,-707,-1000,-707};

Page 32: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 32

/*declar struct for Complex*/ typedef struct tagComplex { float real; float img; }Complex; Complex X[N], z; //declar variables complex struct tagMagnitude{ short max; Uint32 loc; }Magnitude; /*put DFT value to DFT array, note value at here is complex*/ short DFT_Complex[N]; /*real part of DFT*/ short DFT_Real[N/2]; /*wk, to calculate DFT*/ /*pi constant*/ #define pi 3.14 /*determine max of DFT array*/ short max_DFT(Uint32 *loc) { short max; int i; max = DFT_Real[0]; *loc = 0; for( i=0;i<N/2;i++) { if(DFT_Real[i]>max) { max = DFT_Real[i]; *loc = i; } } return max; } void main ( void) { int n,k; float wk,fk; float temp; #ifdef USING_DSK6416 comm_poll(); #endif printf( "-------------------------------------------------\ n" ); printf( "Lab Project: Implement DFT with C program\n" ); printf( "Author: Chu Manh Cuong\n" ); printf( "Group: DHDT4TN\n" ); printf( "Ho Chi Minh University of Industry\n" ); printf( "Project's name: DFT\n" ); printf( "Using DSK6416 to run program\n" ); printf( "Using CCSV4\n" ); printf( "Date: 23/9/2011 \ n" );

Page 33: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 33

printf( "Email: [email protected] or manhcuong.k08@gmai l.com\n" ); printf( "-------------------------------------------------\ n\n" ); printf( "-> %d point DFT of x[n]\n" , sizeof(DFT_Complex)/2); printf( "-> Length of x\n" ); printf( "-> L = %d\n" , sizeof(x)/2); printf( "-> fs = 8Khz\n" ); printf( "-> Calculating...\n" ); for(k=0;k<N;k++) { wk = (k*2*pi)/N; for(n=0;n<L;n++) { z.real = cos(wk*n); z.img = -sin(wk*n); X[k].real += (( float)x[n]) * z.real; X[k].img += (( float)x[n]) * z.img; } #ifdef USING_DSK6416 printf( "-> X[%d] = %f" ,k,X[k].real); if(X[k].img>0) printf( " + %fi\n" ,X[k].img); else printf( " - %fi\n" ,abs(X[k].img)); #endif } /*determine DFT module*/ for(n=0;n<N;n++) { temp = sqrt(X[n].real*X[n].real + X[n].img*X[n].i mg); DFT_Complex[n] = ( short)temp; #ifdef USING_DSK6416 printf( "-> DFT_Complex[%d] = %d\n" ,n,DFT_Complex[n]); #endif } for(n=0;n<N/2;n++) DFT_Real[n] = DFT_Complex[n]; Magnitude.max = max_DFT(&Magnitude.loc); printf( "-> Maximum magnitude = %d \n" ,Magnitude.max); /*determine fk at frequency is maximum*/ fk = (Magnitude.loc*Fs)/N; printf( "-> Mainlobe at freq = %f Hz\n" ,fk); printf( "-> Finish! \n" ); printf( "-> For view, Tool->Graph->Single Time:\n" ); printf( "-> Acquisition Buffer : %d for x, %d for DFT_Compl ex, %d for DFT_Real\n" , sizeof(x)/2, sizeof(DFT_Complex)/2, sizeof(DFT_Real)/2); printf( "-> Dsp Data Type: 16 bit signed interger\n" ); printf( "-> Sampling Rate HZ: 8000\n" ); printf( "-> Start Address : x or DFT_Complex or DFT_Real\n" ); printf( "-> Display Data Size: %d for x, %d for DFT_Complex , %d for DFT_Real\n" , sizeof(x)/2, sizeof(DFT_Complex)/2, sizeof(DFT_Real)/2); getchar(); }

Page 34: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 34

Kết nối board tới máy tính với cable USB, nhấp vào Debug Active Project sau đó nhấn vào Run. Sau khi thực hiện xong chương trình, cửa sổ Console sẽ xuất hiện các thông số về chương trình như sau:

Tiến hành theo hướng dẫn chúng ta sẽ xem được lần lượt: Tín hiệu sine cần xác định DFT:

Page 35: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 35

Đồ thị biến đổi FFT của CCSV4 sẽ có dạng như sau:

Và đây là đồ thị DFT của tín hiệu x(n) sau khi được áp dụng thuật toán DFT: - Phổ phức:

Page 36: DSK6416 Labs Project With CCS V4

www.titans.com.vn / www.hlab.com.vn

[email protected] Page 36

- Phổ thực của tín hiệu:

So sánh DFT thu được sau khi chạy chương trình và FFT của CCSV4 là giống nhau.

Như vậy kết luận rằng với tín hiệu x(n) đã cho trong chương trình chúng ta đã xác định được DFT của nó với kết quả thu được như sau:

N = 128 là số điểm DFT

L = 8 là kích thước của x(n)

Fs = 8Khz là tần số lấy mẫu

Mainlobe DFT của tín hiệu nằm tại vị trí f thu được:

F = 875 Hz