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 :

 

doc19 trang | Chuyên mục: Xử Lý Tín Hiệu Số | Chia sẻ: tuando | Lượt xem: 832 | Lượt tải: 0download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • docbai_tap_xu_ly_so_bai_2_thuc_hien_cac_bo_loc_iir_tren_kit_c67.doc