=>Tín hiệu hình sin có tần số 3KHz, sau khi được lấy mẫu với tần số 4KHz sẽ có phổ được lặp lại sau mỗi khoảng 4KHz.. =>Tín hiệu hình sin 3KHz khi lấy mẫu với tần số 8KHz, tần số này thỏ
Trang 1ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA
Trang 2BÀI 2:
LẤY MẪU VÀ LƯỢNG TỬ HÓA TRÊN KIT C6713 DSK
Họ và tên SV báo cáo 1: Nguyễn Hữu Nhân MSSV: 2111906
Họ và tên SV báo cáo 2: Đỗ Phùng Tuấn Đạt MSSV: 2033132
Họ và tên SV báo cáo 3: Trần Minh Thọ MSSV: 2012128
Trang 3Lấy mẫu tín hiệu:
Ví dụ: Cho tín hiệu hình sin có tần số 3KHz đi qua bộ ADC của AIC32 Tín hiệu sau đó
được
cho đi ngược lại bộ DAC của AIC32 Quan sát tín hiệu được hiển thị trên máy tính
Trong ví dụ này tín hiệu từ máy phát sóng x(t) sau khi đi qua bộ AIC32 trong Kit C6713DSK sẽ là tín hiệu được lấy mẫu x(nT) x(nT) sẽ đi qua hệ thống là vi xử lí
DSP6713 Trong ví dụ này, tín hiệu ngõ ra của hệ thống sẽ giống tín hiệu ngõ vào y(n) = x(nT) Sau đó y(n) sẽ được đưa ngược lại bộ DAC của AIC32 và khôi phục lại thành tín
hiệu y(t) Tín hiệu y(t) sẽ được đưa vào và hiển thị trên máy tính
Chương trình hệ thống cho DSP6713 để lấy tín hiệu ngõ ra là tín hiệu ngõ vào
A Hệ thống này được thực hiện trên kit bằng chương trình sau (viết bằng ngôn ngữ C) B Mở project bộ lọc FIR:
1 Trong chương trình:
Trang 42 Chọn project FIR theo đường dẫn: C:\Program Files \CCStudio_v3.1\ myprojects\ FIR\FIR.pjt
3 Mở chương trình chính FIR.c
Trang 5Viết lại chương trình chính của bộ lọc FIR theo chương trình sau:
//Fir.c FIR filter Include coefficient file with length N #include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
C Biên dịch và chạy chương trình:
1 Chọn Project ➔ Rebuild All hoặc nhấn nút có hình 3 mũi tên xuống trên toolbar CCS sẽ dịch tất cả các tập tin C và Assembly Các tập tin đối tượng tạo ra được
liên kết với các tập tin thư viện Cuối cùng, CCS tạo ra một tập tin thực thi FIR.out
có thể nạp lên kit để chạy (Nếu chương trình biên dịch bị lỗi thì kiểm tra lại và sửa lỗi, sau đó biên dịch lại)
2 Chọn Debug ➔ Connect hoặc bấm tỗ hợp phím Alt+C để kết nối với kit
3 Chọn File ➔Load Program, mở thư mục Debug trong thư mục FIR, chọn tập tin FIR.out để nạp nó lên trên kit Sau đó, chọn Debug ➔ Run để chạy chương trình
trên kit
Trang 64 Khi cần thay đổi hay chỉnh sửa chương trình cho một ví dụ khác, ta chọn Debug ➔ Halt để ngắt kết nối với kit, rồi thực hiện lại các bước như ban đầu
Đánh giá kết quả thực hiện
Mở nguồn của máy phát sóng Tạo một tín hiệu hình sine 3KHz từ máy phát sóng và quan sát dạng sóng ngõ ra.
Tín hiệu hình sin có phổ là 1 vạch tại tần số 3KHz.
Sau khi đã thực hiện ví dụ trên, ta tiếp tục thực hiện việc thay đổi tần số lấy mẫu để thấy rõ hiện tượng aliasing khi không thỏa mãn điều kiện lấy mẫu tín hiệu
AIC23 được cố định tần số lấy mẫu và ta chỉ có thể thay đổi chương trình trong vi xử lý DSP6713 AIC có tần số lấy mẫu là 8KHz, vậy nên trong 1 giây sẽ có 8000 mẫu được đưa tới vi xử lý DSP6713 Chúng ta có thể giảm tốc độ lấy mẫu xuống còn 4KHz bằng cách thay vì vi xử lý lấy toàn bộ mẫu, ta sẽ lấy một mẫu và bỏ 1 mẫu Như vậy trong 1 giây, chúng ta chỉ nhận 4000 mẫu, hay nói cách khác, tốc độ lấy mẫu được thay đổi xuống còn 4KHz
Để thực hiện điều này, ta nhân tín hiệu ngõ vào với một chuỗi tuần hoàn [1, 0, 1, 0, 1, 0,…] Việc này có thể thực hiện trên chương trình bằng dòng lênh sau:
Trang 7yn = pulse * input_sample(); pulse = (pulse==0);
Thực hiện:
Cho tín hiệu hình sin có tần số 3KHz đi qua hệ thống Tín hiệu được lấy mẫu với tần số 4KHz Tín hiệu sau đó được đi qua bộ lọc thông thấp tần số 4KHz Tín hiệu ngõ ra có tần số bao nhiêu?
=>Tín hiệu hình sin có tần số 3KHz, sau khi được lấy mẫu với tần số 4KHz sẽ có phổ được lặp lại sau mỗi khoảng 4KHz Khi đi qua bộ lọc thông thấp tần số 4KHz, sẽ có 2 vạch phổ còn tồn tại tại tần số 1KHz và 3KHz Vậy tín hiệu ngõ ra sẽ là tổng của 2 tín
hiệu có tần số 1KHz và 3KHz
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_4KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); } //infinite loop
Trang 8Quan sát và vẽ lại dạng dóng và phổ của tín hiệu ngõ ra So sánh với trường hợp ví dụ khi ta lấy mẫu với tần số 8KHz Nhận xét
=>Tín hiệu hình sin 3KHz khi lấy mẫu với tần số 8KHz, tần số này thỏa mãn định lý lấy mẫu nên tín hiệu ngõ ra sau khi phục hồi sẽ phổ là 1 vạch tại tần số 3KHz Còn khi lấy mẫu với tần số 4KHz, tín hiệu có phổ lặp lại sau mỗi khoảng tần số 3KHz, nên sẽ xuất hiện vạch phổ tại tần số 1KHz Vậy nên tín hiệu ngõ ra khi lấy mẫu với tần số 4KHz sẽ
có 2 vạch phổ tại 1KHz và 3KHz Điều này phù hợp với tính toán
Cho tín hiệu xung vuông có tần số 0.5KHz đi qua hệ thống Tín hiệu được lấy mẫu với tần số 8KHz Tín hiệu sau đó được phục hồi lý tưởng Quan sát và vẽ lại dạng dóng và phổ của tín hiệu ngõ ra Nhận xét và giải thích ngắn gọn
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N #include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file
Trang 9Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
{ comm_intr(); //init DSK, codec, McBSP while(1); } //infinite loop
Tín hiệu xung vuông có tần số 0.5 KHz khi lấy mẫu sẽ có các vạch phổ tại 0.5KHz, 1.5
KHz, 2.5 KHz, 3.5KHz … Tín hiệu hiển thị trên máy tính đúng như lý thuyết
Thay đổi tần số lấy mẫu còn 4KHz Quan sát và vẽ dạng sóng và phổ tín hiệu ngõ ra So sánh 02 trường hợp khi lấy mẫu với tần số 4KHz và 8KHz của xung vuông tần số 0.5KHz Nhận xét và giải thích ngắn gọn
Trang 10Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_4KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); } //infinite loop
Trang 11Tín hiệu xung vuông tần số 0.5KHz khi lấy mẫu với tần số 4KHz Các hài ở tần số 0.5KHz và 1.5KHz sẽ được giữ nguyên Các hài 2.5KHz bị aliasing thành tần số 01.5KHz và cộng vào hài 1.5KHz Tương tự hài 3.5KHz bị aliasing và bị cộng vào hài 0.5KHz (sở dĩ có thêm hài tại 2.5KHz và 3.5KHz là vì: vạch phổ tại 0.5KHz và
-1.5KHz sẽ được lặp lại sau mỗi khoảng 4KHz nên xuất hiện tại 2.5KHz và 3.5KHz)
Lượng tử hóa tín hiệu:
Mỗi mẫu tín hiệu được AIC32 mã hóa và đưa tới vi xử lý sẽ có dạng chuỗi bit: [b1, b2, b3, b4, b5, b6, b7, b8, 0, …0] (24 số không)
Trong đó bit b1 là MSB và b8 là LSB
Chúng ta có thể thay đổi số mức lượng tử xuống thấp hơn bằng cách dịch phải rồi dịch trái chuỗi bit Ví dụ ta có thể thay đổi từ 256 mức lượng tử (tương ứng 8bit) xuống thành 128 mức (tương ứng 7bit) bằng cách bỏ đi bit cuối cùng b8 Điều này được thực hiện bằng cách dịch phải rồi dịch trái 25bit như sau:
Trang 12[b1, b2, b3, b4, b5, b6, b7, b8, 0, …0] => [0, 0,…0, b1, b2, b3, b4, b5, b6, b7,] => [b1, b2, b3, b4, b5, b6, b7, 0, 0, …0]
Việc này có thể thực hiện trên chương trình bằng dòng lênh sau:
yn = (input_sample() >> 25) << 25;
1 Cho tín hiệu hình sin có tần số 3KHz đi qua hệ thống Tín hiệu được lấy mẫu với tần số 8KHz Mỗi mẫu tín hiệu được mã hóa thành chuỗi 8bit Tín hiệu sau đó được phục hồi lý tưởng Quan sát và vẽ dạng sóng và phổ tín hiệu ngõ ra
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 13Tín hiệu hình sin có phổ là 1 vạch tại tần số 3KHz Tín hiệu hình sin được mã hóa bằng 8bit (256 mức lượng tử), khi này mức sai số lượng tử đủ nhỏ để phục hồi lại được hình
sin như ban đầu
Thực hiện việc giảm dần số bit mã hóa xuống còn 6, 4, 2, 0 bit Quan sát và vẽ dạng sóng và phổ tín hiệu ngõ ra Nhận xét
+Trường hợp mỗi mẫu được mã hóa bằng 6bit Viết lại chương trình chính của bộ
lọc FIR theo chương trình sau:
//Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
int pulse;
Trang 14interrupt void c_int11() //ISR
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Tín hiệu hình sin được mã hóa bằng 6bit (64 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 4 lần so với việc mã hóa bằng 8bit Như vậy tín hiệu hình sin khi phục hồi sẽ không còn được là hình sin như ban đầu Theo như kết quả thí nghiệm, lúc này 1
Trang 15vạch phổ nhỏ xuất hiện thêm tại tần số 1KHz chứ không phải chỉ là 1 vạch phổ duy nhất
tại tần số 3KHz
+Trường hợp mỗi mẫu được mã hóa bằng 4bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 16Tín hiệu hình sin được mã hóa bằng 4bit (16 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 16 lần so với việc mã hóa bằng 8bit Như vậy tín hiệu hình sin khi phục hồi sẽ không còn được là hình sin như ban đầu Theo như kết quả thí nghiệm, lúc này
vạch phổ tại tần số 1KHz sẽ lớn hơn so với trường hợp mã hóa bằng 6bit
+Trường hợp mỗi mẫu được mã hóa bằng 2bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
int pulse;
Trang 17interrupt void c_int11() //ISR
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Tín hiệu hình sin được mã hóa bằng 2bit (44 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 128 lần so với việc mã hóa bằng 8bit Như vậy tín hiệu hình sin khi phục hồi sẽ không còn được là hình sin như ban đầu Theo như kết quả thí nghiệm, lúc này vạch phổ tại tần số 1KHz rất lớn Tại tần số 2KHz cũng bắt đầu xuất hiện 1 vạch phổ
nhỏ Tín hiệu lúc này khác rất nhiều so với tín hiệu hình sin ban đầu
Trang 18+Trường hợp mỗi mẫu được mã hóa bằng 0bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 19Tín hiệu mã hóa bằng 0bit, nghĩa là mỗi mẫu tín hiệu có giá trị bất kỳ đều được mã hóa thành chuỗi bit 0000… Như vậy tín hiệu sau khi được phục hồi chỉ là 1 đường tín hiệu DC có giá trị 0V
Cho tín hiệu xung vuông có tần số 3KHz đi qua hệ thống Tín hiệu được lấy mẫu với tần số 8KHz Mỗi mẫu tín hiệu được mã hóa thành chuỗi 8bit Tín hiệu sau đó được phục hồi lý tưởng Quan sát và vẽ dạng sóng và phổ tín hiệu ngõ ra
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 20Tín hiệu xung vuông có tần số 3KHz sẽ có các vạch phổ tại các tần số 3KHz, 9KHz, 15KHz… Chương trình hiển thị chỉ hiển thị và vẽ tín hiệu trong khoảng tần số [0, 4KHz], nên tín hiệu xung vuông được hiển thị chỉ có phổ là 1 vạch tại tần số 3KHz Tín hiệu xung vuông được mã hóa bằng 8bit (256 mức lượng tử), khi này mức sai số lượng tử đủ
nhỏ để phục hồi lại được như ban đầu
Thực hiện việc giảm dần số bit mã hóa xuống còn 6, 4, 2, 0 bit Quan sát và vẽ dạng sóng và phổ tín hiệu ngõ ra So sánh và nhận xét với trường hợp sóng sin
+Trường hợp mỗi mẫu được mã hóa bằng 6bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
int pulse;
interrupt void c_int11() //ISR
Trang 21comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Tín hiệu xung vuông được mã hóa bằng 6bit (64 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 4 lần so với việc mã hóa bằng 8bit Theo như kết quả thí nghiệm, lúc này 1 vạch phổ nhỏ xuất hiện thêm tại tần số 1KHz chứ không phải chỉ là 1 vạch phổ duy nhất tại tần số 3KHz Điều này thể hiện tín hiệu ngõ ra bị méo dạng so với tín hiệu
ban đầu
Trang 22Trường hợp mỗi mẫu được mã hóa bằng 4bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 23Tín hiệu xung vuông được mã hóa bằng 4bit (16 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 16 lần so với việc mã hóa bằng 8bit Theo như kết quả thí nghiệm, lúc này 1 vạch phổ nhỏ xuất hiện thêm tại tần số 1KHz chứ không phải chỉ là 1 vạch phổ duy nhất tại tần số 3KHz Vạch phổ tại tần số 1KHz lớn hơn so với trường hợp mã hóa bằng 6bit Điều này thể hiện tín hiệu ngõ ra bị méo dạng hơn so với trường hợp mã hóa bằng 6bit
+Trường hợp mỗi mẫu được mã hóa bằng 2bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
int pulse;
Trang 24interrupt void c_int11() //ISR
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Tín hiệu xung vuông được mã hóa bằng 2bit (4 mức lượng tử), khi này sai số lượng tử hiệu dụng sẽ tăng lên 64 lần so với việc mã hóa bằng 8bit Theo như kết quả thí nghiệm, lúc này vạch phổ tại tần số 1KHz sẽ lớn hơn nhiều so với trường hợp mã hóa bằng 4bit Đồng thời tại tần số 2KHz cũng bắt đầu xuất hiện thêm 1 vạch phổ nhỏ Tín hiệu sẽ rất
khác so với tín hiệu ban đầu
Trang 25+Trường hợp mỗi mẫu được mã hóa bằng 0bit
Viết lại chương trình chính của bộ lọc FIR theo chương trình sau: //Fir.c FIR filter Include coefficient file with length N
#include "coefficients.h" //coefficient file
#include "dsk6713_aic23.h" //codec-dsk support file Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate int yn = 0; //initialize filter's output
comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop
}
Trang 26Tín hiệu mã hóa bằng 0bit, nghĩa là mỗi mẫu tín hiệu có giá trị bất kỳ đều được mã hóa thành chuỗi bit 0000… Như vậy tín hiệu sau khi được phục hồi chỉ là 1 đường tín hiệu DC có giá trị 0V
5 Một hệ thống có tần số lấy mẫu fs = 8KHz Xác định tần số cắt của bộ tiền lọc lý tưởng để không xảy ra hiện tượng aliasing Giải thích
Để không xảy ra hiện tượng aliasing thì tần số cắt 𝑓c ≤ 𝑓𝑠
phục hồi lại tín hiệu Tín hiệu được lấy mẫu với tần số 4KHz Sau đó tín hiệu được phục hồi lý tưởng Xác định tín hiệu sau khi được phục hồi lý tưởng Giải thích ngắn
y(t) = 5sin( −2𝜋𝑡) = -5sin( 2𝜋𝑡)
7 Cho một tín hiệu có tầm toàn thang R = 10V Xác định số bit B để mã hóa tín hiệu được sai số lượng tử hiệu dụng (rms) không quá 50 microV
Số bit B để mã hóa tín hiệu được sai số lượng tử hiệu dụng (rms) không quá 50 microV:
Trang 278 Cho một tín hiệu lưỡng cực có tầm toàn thang là 16V, được mã hóa thành 4bit bằng phương pháp rounding Các mẫu tín hiệu có giá trị: -7.9, -7.1,- 6.8,- 5.5,-3.1, 0, 1.3, 2.6, 5.8, 6.9
Q = 𝑅
16 = 1 V
Xác định chuỗi bit cho các mẫu trên nếu mã hóa bằng :
Giá trị bộ mã offset binary bộ mã bù bậc 2