Bài tập Xử lý số - Bài 2: Thực hiện các bộ lọc IIR trên KIT C6713 DSK
Việc nhân sos với 2^15 là do bộ xử lý sẽ lượng tử hóa các hệ số với một số lượng bit hữu hạn và việc nhân lên sẽ giảm đi sai số. Lệnh format short g,sos để các phần tử trong ma trận sos hiện thị số không có dấu chấm động 5 digits.
b. Thực hiện bộ lọc lên KIT C713 DSK:
- Mở CCS lên, Connect với KIT, rồi Open Project có tên IIR.pjt có sẵn trong thư mục C:\\CCStudio_v3.1\myprojects\IIR.
- Trong cửa sổ Project View, tab File View, mở tập tin coefficients.h(trong Includes).
- Nhập các thông số cho bộ lọc như sau :
2sos(z,p,k); >> sos = sos*2^15; >> format short g,sos sos = 277.43 505.7 277.43 32768 -5205.4 685.96 32768 28730 32768 32768 -9808.1 4566.4 32768 1776.6 32768 32768 -16993 10999 32768 -13190 32768 32768 -24574 18719 32768 -19515 32768 32768 -31397 27563 Việc nhân sos với 2^15 là do bộ xử lý sẽ lượng tử hóa các hệ số với một số lượng bit hữu hạn và việc nhân lên sẽ giảm đi sai số. Lệnh format short g,sos để các phần tử trong ma trận sos hiện thị số không có dấu chấm động 5 digits. Thực hiện bộ lọc lên KIT C713 DSK: Mở CCS lên, Connect với KIT, rồi Open Project có tên IIR.pjt có sẵn trong thư mục C:\\CCStudio_v3.1\myprojects\IIR. Trong cửa sổ Project View, tab File View, mở tập tin coefficients.h(trong Includes). Nhập các thông số cho bộ lọc như sau : Thực hiện biên dich chương trình : Project à ReBuild All Load file *.out : File à Load Program dẫn tới file IIR.out trong thư mục dubug. Chạy chương trình : Debug à Run Kiểm tra bộ lọc đã thực hiện : Thay đổi tần số ngỏ vào để tìm tần số cắt, ta quan sát tín hiệu trên DSP_Tools.exe, quan sát tới khi biên độ cực đại giảm xuống lần, thu được f_cắt = 1.55 Khz. Kiểm tra bộ lọc với các tần số vào điều chỉnh từ dao động ký : 0.5 Khz 1 Khz: 2 Khz: Nhận xét : Bộ lọc đáp ứng được yêu cầu thiết kế. Các tín hiệu có tần số ngoài 1.55 Khz tín hiệu suy hao đáng kể, và gần như bị triệt tiêu với tần số vào là 2 Khz và lớn hơn. Thiết kế bộ lọc IIR thông dải loại Chybyshev 2 Các thông số thiết kế: Bậc bộ lọc : 36 (Với Matlab 2007 ta nhập trực tiếp bậc là 36). Tần số dải chắn : 1.6Khz và 2.4Khz. Độ gợn dải chắn : 100 dB. Tần số lấy mẫu : 8Khz. Thiết kế bộ lọc trên MatLab Nhập dòng lệnh >>Sptool trên cửa sổ Command Window Nhập các thông số yêu cầu của bộ lọc & Design, ta có đáp ứng theo tần số như sau: Trong cửa sổ Sptool : đổi tên cho bộ lọc là bp2000 và xuất ra vùng WorkSpace. Từ cửa sổ Command Window, ta thực hiện các lệnh sau để xuất ra ma trận sos (Second Order Section), dùng để nạp lên KIT. >> [z,p,k]=tf2zp(bp2000.tf.num,bp2000.tf.den); >> sos = zp2sos(z,p,k); >> sos = sos*2^15 sos = 1.602 3.0947 1.602 32768 3274.7 12928 32768 -63298 32768 32768 -3274.7 12928 32768 -51261 32768 32768 -8790.8 15119 32768 51261 32768 32768 8790.8 15119 32768 39945 32768 32768 12349 18265 32768 -39945 32768 32768 -12349 18265 32768 32302 32768 32768 14310 21411 32768 -32302 32768 32768 -14310 21411 32768 -27364 32768 32768 -15280 24186 32768 27364 32768 32768 15280 24186 32768 -24164 32768 32768 -15730 26536 32768 24164 32768 32768 15730 26537 32768 22117 32768 32768 15963 28537 32768 -22117 32768 32768 -15963 28537 32768 -20895 32768 32768 -16162 30299 32768 20895 32768 32768 16162 30299 32768 20322 32768 32768 16437 31947 32768 -20322 32768 32768 -16437 31947 Việc nhân sos với 2^15 là do bộ xử lý sẽ lượng tử hóa các hệ số với một số lượng bit hữu hạn và việc nhân lên sẽ giảm đi sai số. Thực hiện bộ lọc lên KIT C713 DSK: Mở CCS lên, Connect với KIT, rồi Open Project có tên IIR.pjt có sẵn trong thư mục C:\\CCStudio_v3.1\myprojects\IIR. Trong cửa sổ Project View, tab File View, mở tập tin coefficients.h(trong Includes). Nhập các thông số cho bộ lọc như sau : //coefficients.cof IIR bandpass coefficient file, centered at 2000 Hz #define stages 18 //number of 2nd-order stages int a[stages][3]={ //numerator coefficients {1.602,3.0947, 1.602}, //a10, a11, a12 for 1st stage {32768,-63298, 32768}, //a20, a21, a22 for 2nd stage {32768,-51261, 32768}, //a30, a31, a32 for 3rd stage {32768, 51261, 32768}, //a40, a41, a42 for 4th stage {32768, 39945, 32768} , {32768,-39945, 32768}, {32768, 32302, 32768}, {32768,-32302, 32768}, {32768,-27364, 32768}, {32768, 27364, 32768}, {32768,-24164, 32768}, {32768, 24164, 32768}, {32768, 22117, 32768}, {32768,-22117, 32768}, {32768,-20895, 32768}, {32768, 20895, 32768}, {32768, 20322, 32768}, {32768,-20322, 32768} }; int b[stages][2]={ //*denominator coefficients {3274.7,12928}, //b11, b12 for 1st stage {-3274.7,12928}, //b21, b22 for 2nd stage {-8790.8,15119}, //b31, b32 for 3rd stage {8790.8, 15119}, //b41, b42 for 4th stage {12349, 18265}, {-12349, 18265}, {14310, 21411}, {-14310, 21411}, {-15280, 24186}, {15280, 24186}, {-15730, 26536}, {15730, 26537}, {15963, 28537}, {-15963, 28537}, {-16162, 30299}, {16162, 30299}, {16437, 31947}, {-16437, 31947} }; //b51, b52 for 5th stage Thực hiện biên dich chương trình : Debug à ReBuild All Load file *.out : File à Load Program dẫn tới file IIR.out trong thư mục dubug. Chạy chương trình : Debug à Run Kiểm tra bộ lọc đã thực hiện : Thay đổi tần số ngỏ vào để tìm tần số cắt, ta quan sát tín hiệu trên DSP_Tools.exe. Kiểm tra bộ lọc với các tần số vào điều chỉnh từ dao động ký : 1 Khz: 1.8 Khz: 2Khz: 2.2 Khz: 3Khz: Nhận xét: Với các đáp ứng tương ứng với tần số vào như trên, bộ lọc thông dải thỏa yêu cầu. Tạo hai tone bằng cách sử dụng hai phương trình sai phân bậc 2 Trong thí nghiệm này, chúng ta sẽ tạo và cộng 2 tones bằng phương pháp phương trình sai phân. Tín hiệu ra cũng được lưu trong bộ nhớ và được vẽ bằng CCS. Phương trình sai phân dùng để tạo 1 sóng sine là: y(n) = Ay(n-1) – y(n-2) trong đó: A = 2cos() y(-1) = - sin() y(-2) = - sin() Tạo hai tone có tần số 1.5Khz & 2Khz Tính A, y(-1), y(-2) Tần số 1.5 Khz : A1 = 2cos()* = 2cos()* = 12540 y1(-1) = - sin()* = -1517 y2(-2) = - sin()* = -11585 Tần số 2 Khz : A2 = 2cos()* = 0 y2(-1) = - sin()* = -16384 y2(-2) = - sin()* = 0 Chạy CCS và mở project two_tones.pjt trong thư mục C:\\CCStudio_v3.1\myprojects\two_tones. Mở tập tin nguồn của chương trình two_tones.c. Chúng ta gán các giá trị vừa tính toán để tạo ra 2 tones là 2 tần số trên: //two_tones.c Generates/adds two tones using difference equations #include "DSK6713_AIC23.h" //codec-DSK support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate short sinegen(void); //for generating tone short output; //for output short sinegen_buffer[256]; //buffer for output data const short bufferlength = 256; //buffer size for plot with CCS short i = 0; //buffer count index short y1[3] = {0,-15137,-11585}; //y1(0),y1(-1),y1(-2) for 1.5kHz const short A1 = 12540; //A1 = 2coswT scaled by 2^14 short y2[3] = {0,-16384,0}; //y2(0),y2(-1),y2(-2) for 2kHz const short A2 = 0; //A2 = 2coswT scaled by 2^14 interrupt void c_int11() //ISR { output = sinegen(); //out from tone generation function sinegen_buffer[i] = output; //output into buffer output_sample(output); //output result i++; //increment buffer count if (i == bufferlength) i = 0; //if buffer count = size of buffer return; //return to main } short sinegen() //function to generate tone { y1[0] =((y1[1]*A1)>>14)-y1[2]; //y1(n)= A1*y1(n-1)-y1(n-2) y1[2] = y1[1]; //update y1(n-2) y1[1] = y1[0]; //update y1(n-1) y2[0] =((y2[1]*A2)>>14)-y2[2]; //y2(n)= A2*y2(n-1)-y2(n-2) y2[2] = y2[1]; //update y2(n-2) y2[1] = y2[0]; //update y2(n-1) return (y1[0] + y2[0]); //add the two tones } void main() { comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop } Thực hiện biên dich chương trình : Debug à ReBuild All Load file *.out : File à Load Program dẫn tới file two_tones.out trong thư mục dubug. Chạy chương trình : Debug à Run Xem phổ biên độ FFT của tín hiệu ra: View à Graph à Time/Frequency Thiết lập các thông số như sau để xem được phổ: Phổ thu được như sau: Kiểm chứng kết quả bằng DSP_tools : Nhận xét : Phổ thu được là 2 ngọn phổ tại tần số 1.5 Khz & 2 Khz . Bộ lọc thực hiện đúng. Tạo hai tone có tần số 697Hz & 1209Hz Tính A, y(-1), y(-2) Tần số 697Hz : A1 = 2cos()* = 2cos()* = 27980 y1(-1) = - sin()* = -8527 y2(-2) = - sin()* = -14563 Tần số 1209Hz : A2 = 2cos()* = 19073 y2(-1) = - sin()* = -13323 y2(-2) = - sin()* = 15509 Chạy CCS và mở project two_tones.pjt trong thư mục C:\\CCStudio_v3.1\myprojects\two_tones. Mở tập tin nguồn của chương trình two_tones.c. Chúng ta gán các giá trị vừa tính toán vào 2 vị trí đánh dấu như ở phần trước. Phổ trên CCS thu được như sau: Kiểm chứng bằng DSP_Tools: Nhận xét: Kết quả thu được là 2 tone có tần số 697 Hz và 1209 Hz , đây là 1 tổ hợp tần số tạo nên âm thanh khi nhấn phím 1 trên điện thoại. Đây là kỹ thuật tạo tín hiệu DTMF (Dual tone multifrequency). Tạo tín hiệu hình sine bằng một phương trình sai phân Một tín hiệu sine cũng có thể tạo ra bằng 1 phương trình sai phân khác: Y(n) = Ay(n-1) + By(n-2) + Cx(n-1) với B= -1. n = 0, x(n-1) = x(0) = 1. n = 1: y(1) = Ay(0) + By(-1) + Cx(0) = C ; với y(0) = 0, y(-1) = 0. n ≥ 2 : y(n) = Ay(n-1) – y(n-2) Hệ số : A = 2cos(), C = sin() , Xác định tần số ngõ ra : Mở CCS, Open project có tên là sinegenDE.pjt tại thư mục C:\\CCStudio_v3.1\myprojects\sinegenDE Biên dịch chương trình và chạy. Quan sát phổ bằng DSP_Tools xác định được tần số ngõ ra là 2Khz: Tạo một tone có tần số 1Khz: Tính A, y[3] A = 2cos()* = 2cos()* = 23710 y(0) = 0 y(1) = C = sin()* = sin()* = 11585 y(2) = (Ay(n-1) – y(n-2) )*= AC* = 2cos() sin()* = sin()* = 16384 Trước khi thực hiện lên KIT, Halt chương chình CCS lại, mở tập tin nguồn chính sinegenDE.c và điền lại các giá trị vừa tính toán vào : //SinegenDE.c Generates a sinewave using a difference equation #include "dsk6713_aic23.h" //codec-DSK file support Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate short y[3] = {0,11585,16384}; //y(0),y(1),y(2) const short A = 23710; //A = 2*coswT * 2^14 int n = 2; interrupt void c_int11() //ISR { y[n] = ((A*y[n-1])>>14) - y[n-2]; //y(n)=Ay(n-1)-y(n-2) y[n-2] = y[n-1]; //update y(n-2) y[n-1] = y[n]; //update y(n-1) output_sample(y[n]); //output result return; //return to main } void main() { comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop } Biên dịch chương trình và chạy. Quan sát phổ bằng DSP_Tools xác định được tần số ngõ ra là 1Khz:
File đính kèm:
- bai_tap_xu_ly_so_bai_2_thuc_hien_cac_bo_loc_iir_tren_kit_c67.doc