=>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
KHOA ĐIỆN-ĐIỆN TỬ
Báo cáo thí nghiệm
Môn học: Xử lý số tín hiệu Giảng viên hướng dẫn: Nguyễn Xuân Xinh
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
Nhóm lớp: DT02 Nhóm: 9 Ngày thí nghiệm: 28/06/2023
và ký tên Chuẩn bị lý
thuyết
Báo cáo và kết quả thí nghiệm
Kiểm tra Kết quả
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:
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
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 27Q = 𝑅
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