You are on page 1of 54

ĐẠ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
Danh sách nhóm 9
1.Nguyễn Hữu Nhân 2111906
2.Đỗ Phùng Tuấn Đạt 2033132
3.Trần Minh Thọ 2012128

Tháng 8 năm 2023

1
BÀ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

CBGD nhận xét


Điểm đánh giá
và ký tên

Chuẩn bị lý Báo cáo và kết Kiểm tra Kết quả


thuyết quả thí nghiệm
Lấ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:
2. 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
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
{
yn = input_sample();
output_sample(yn >> 15); //scale output filter sample
return;
}

void main()
{
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.
4. 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:
yn = 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
int pulse;
interrupt void c_int11() //ISR
{
yn = pulse * input_sample();
pulse=(pulse==0) ;
output_sample(yn >> 15); //scale output filter sample
return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); } //infinite loop
Quan 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
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate
int yn = 0; //initialize filter's output
int pulse;
interrupt void c_int11() //ISR
{
yn = input_sample();
output_sample(yn >> 15); //scale output filter sample
return;
}

void main()
{ 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.
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
int pulse;
interrupt void c_int11() //ISR
{
yn = pulse * input_sample();
pulse=(pulse==0)
output_sample(yn >> 15); //scale output filter sample
return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); } //infinite loop
Tí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:
[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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>25)<<25;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>26)<<26;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
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
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.

+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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>28)<<28;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>30)<<30;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
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.
+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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>32)<<32;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>25)<<25;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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
{
yn = (input_sample()>>26)<<26;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_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.
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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>28)<<28;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>32)<<32;

output_sample(yn >> 15); //scale output filter sample


return;
}

void main()
{
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.
+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
int pulse;
interrupt void c_int11() //ISR
{
yn = (input_sample()>>32)<<32;

output_sample(yn >> 15); //scale output filter sample


return;

void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
Tí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.

𝑓𝑠 8
Để không xảy ra hiện tượng aliasing thì tần số cắt 𝑓 c ≤ = = 4 kHz
2 2

6. Một tín hiệu x(t) = 5 𝐬𝐢𝐧(𝟔𝝅𝒕) (t: ms). Xác định tần số lấy mẫu thấp nhất để có
thể
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
gọn.

Tần số tín hiệu: 𝑓 = 3 kHz

Tần số lấy mẫu:

𝑓 s ≥ 2*𝑓 max =2*3=6 kHz => 𝑓 s min =6 kHz

Tín hiệu được lấy mẫu với tần số 4 kHz. Tín hiệu sau khi được phục hồi lý tưởng:

+𝑓 = 3 kHz > 𝑓 a = 3 mod 4 = -1 kHz

 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:
𝑅 𝑅 10
erms = ≤ 50*10−3 => B ≥ log 2 = log 2 = 5.8514
2𝐵 √12 50√12 50√12

 B= 6 bit

8. 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.

𝑅 16
Q= = =1V
24 16

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

-7.9 0000 1000

-7.1 0001 1001

-6.8 0001 1001

-5.5 0011 1011

-3.1 0101 1101

0 1000 0000

1.3 1001 0001

2.6 1011 0011

5.8 1110 0110

6.9 1111 0111


BÀI 3: BỘ LỌC FIR/IIR 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: 12/07/2023

CBGD nhận
Điểm đánh giá
xét và ký tên

Chuẩn bị lý Báo cáo và kết Kiểm tra Kết quả


thuyết quả thí nghiệm

5/ Tiến hành thí nghiệm.

5.1/ Các bộ lọc FIR

5.1.1/ Bộ lọc FIR chắn dải.


- Thiết kế, thực hiện và khảo sát bộ lọc FIR chắn dải bằng phương pháp cửa sổ
Kaiser với các thông số sau:
• Chiều dài của đáp ứng xung: N = 63
• Tần số trung tâm: 2700 Hz
• Tần số cắt: 2500 Hz và 2900 Hz
• Giá trị của 𝛽 = 4
• Tần số lấy mẫu 8000 Hz
- Thiết kế bộ lọc dùng MATLAB, ta thu được đáp ứng tần số của bộ lọc như hình
vẽ:

- Giá trị các hệ số của đáp ứng xung:

-57 55 23 -112 103 23 -143


123 11 -98 55 0 72 -170

25 381 -594 131 794 -1205 350

1229 -1922 683 1579 -2606 1080 1753

-3100 1454 1704 29525 1704 1454 -3100

1753 1080 -2606 1579 683 -1922 1229

350 -1205 794 131 -594 381 25

-170 72 0 55 -98 11 123

-143 23 103 -112 23 55 -57

- Dạng sóng đáp ứng của bộ lọc:


- Đáp ứng biên độ - tần số và pha - tần số của bộ lọc:

❖ Kiểm tra bộ lọc:


1. Mở nguồn máy phát sóng. Tạo một tín hiệu vào hình sine từ máy phát sóng,
lần lượt thay đổi tần số của tín hiệu vào tuỳ 100Hz đến 4KHz (mỗi lần
100Hz), ghi nhận biên độ dạng sóngvà biên độ phổ của tín hiệu ngõ ra từ đó
xác định đặc tính của bộ lọc:

Tần số
(Hz)
100 500 1000 2000 2400 2500 2600 2700 2800 2900 3000 3200 3400 3600
Biên
độ
Phổ (V) 6.5 6.5 5.9 4.9 5 2.9 0.5 0.2 0.6 3.1 5.8 6.6 6.5 5.7
Sóng 180 210 200 200
200 210 200 200 280 100 15 5 28 100
(mV)

• Đặc tính của bộ lọc: Bộ lọc có tính chắn dải với các giá trị ngõ vào có tần
số nằm ngoài đoạn 2500Hz – 2900Hz có biên độ suy giảm không đáng kể,
và giá trị biên độ ở ngõ ra của các ngõ vào có giá trị tần số nằm trong
khoảng 2500Hz – 2900Hz suy giảm mạnh.
2. Tạo một sóng vuông từ máy phát sóng, lần lượt thay đổi tần số của tín hiệu
vào ghi nhận các thành phần tần số của ngõ ra. Giải tích tại sao có dạng phổ
này?*

𝑓𝑖 (𝐻𝑧) 100 200 550 900

𝑓0 (𝐻𝑧) 112 224 560 912


320 608 1664
510

Giải thích Do sóng vuông là tổng của vô số tín hiệu tuần hoàn sin
(các hài), tần số của mỗi hài là 𝑓𝑘 = 𝑘𝑓0 (𝑘 = 1,2, … ), và
biên độ của hài cơ bản (𝑓0 ) có giá trị lớn nhất và biên độ
của các hài càng giảm dần khi tần số càng cao.

Đối với sóng vuông có các thành phần hài cơ bản nằm xa
dải chắn thì càng có nhiều thành phần tần số xuất hiện và
với các sóng vuông có thành phần sóng hài cơ bản nằm
gần dải chắn thì càng có ít thành phần tần số xuất hiên.

5.1.2/ Bộ lọc FIR thông dải.

- Thiết kế, thực hiện và kiểm tra bộ lọc FIR thông dải bằng phương pháp Kaiser
window với các thông số như sau:
• Chiều dài đáp ứng xung: 63.
• Tần số cắt: 1500 và 2000 Hz.
• Giá trị của 𝛽 = 5.
• Tần số lấy mẫu: 8 KHz
1. Đáp ứng cảu bộ lọc thiết kế dùng MATLAB:
- Các giá trị đáp ứng xung:
-1 13 16 -34 -62 41 138
0 -208 -92 215 185 -134 -180
23 0 -30 325 328 -612 -978
579 1834 0 -2545 -1126 2711 2503
-2094 -3640 789 4081 789 -3640 -2094
2503 2711 -1126 -2545 0 1834 579
-978 -612 328 325 -30 0 23
-180 -134 185 215 -92 -208 0
138 41 -62 -34 16 13 -1

- Dạng sóng đáp ứng của bộ lọc:


- Đáp ứng biên độ - tần số và pha - tần số của bộ lọc:

❖ Kiểm tra bộ lọc:


1. Mở nguồn của máy phát sóng. Tạo một tín hiệu vào hình sine từ máy phát sóng,
lần lượt thay đổi tần số của tín hiệu vào từ 100 Hz đến 4 KHz (mỗi tần 100Hz),
ghi nhận biên độ dạng sóng và biên độ phổ của tín hiệu ngõ ra từ đó xác định đặc
tính của bộ lọc.
Tần số
(Hz)
1000 1200 1400 1500 1600 1700 1800 1900 2000 2100 2200 2400 2600 2800
Biên
độ
0 0 0 0
Phổ (V) 0 0 0.5 3 6 6.2 4.3 5.3 3.4 0.8

Sóng 0 0 0 0
0 0 20 100 160 200 2000 180 100 25
(mV)

Đặc tính của bộ lọc: bộ lọc có tính thông dải, các thành phần ngõ vào ở tần số thuộc
khoảng từ 1600 – 2000 Hz giữ được nguyên giá trị ban đầu (nếu có suy giảm thì cũng
không đáng kể), các tần số nằm ngoài khoảng này điều suy giảm mạnh (biên độ rất nhỏ
so với những thành phần ngõ vào có tần số nằm trong dải thông).
2. Tạo một sóng vuông từ máy phát sóng, lần lượt thay đổi tần số của tín hiệu vào
ghi nhận các thành phần tần số của ngõ ra. Giải tích tại sao có dạng phổ này?
𝑓𝑖 (𝐻𝑧) 100 200 550 900

𝑓0 (𝐻𝑧) 160 160 1800 1800


1800
Giải thích Do sóng vuông là tổng của vô số tín hiệu tuần hoàn sin
(các hài), tần số của mỗi hài là 𝑓𝑘 = 𝑘𝑓0 (𝑘 = 1,2, … ), và
biên độ của hài cơ bản (𝑓0 ) có giá trị lớn nhất và biên độ
của các hài càng giảm dần khi tần số càng cao.

Đối với sóng vuông có các thành phần sóng hài cơ bản
nằm xa dải thông (thành phần phía tần số thấp của bộ lọc
thông dải) thì sẽ càng thấy ít các thành phần tần số của
sóng do đa phần những thành phần tần số có biên độ lớn
của sóng đầu vào đều nằm trong dài chắn của bộ lọc, còn
các thành phần tần số cao thì lại có biên độ quá nhỏ do đó
có ít thành phần tần số có thể quan sát được. Do đó các
sóng vuông có thành phần hài cơ bản càng gần với dải
thông của bộ lọc chắn dải thì càng dễ dàng quan sát được
nhiều thành phần hài khác hơn.
5.2/ Các bộ lọc IIR.

5.2.1/ Bộ lọc IIR chắn dải.

- Thiết kế, thực hiện và kiểm tra một bộ lọc IIR chắn dải bậc 10, tần số trung tâm
1750 Hz, sử dụng phương pháp Eliptic với các thông số như sau:
• Tần số cắt: 1700 Hz và 1800 Hz
• Độ gợn dải thông và dải chắn tương ứng là 1 dB và 60 dB
• Tần số lấy mẫu: 800 Hz
1. Đáp ứng cảu bộ lọc thiết kế dùng MATLAB:

- Ghi nhận các phần tử của ma trận sos:


27940 -10910 27940 -11417 25710

32768 -11841 32768 -9204 31581

32768 -13744 32768 -15860 31605

32768 -11338 32768 -10221 32581

32768 -14239 32768 -15258 32584


❖ Kiểm tra bộ lọc.
1. Mở nguồn của máy phát sóng. Tạo một tín hiệu vào hình sine từ máy phát
sóng, lần lượt thay đổ tần số của tín hiệu vào từ 100 Hz đến 4KHz (mỗi
lần 100 Hz), ghi nhận biên độ dạng sóng và biên độ phổ của tín hiệu ngõ
ra từ đó xác định đặc tính của bộ lọc.

Tần số

(Hz)
100 500 1000 1400 1700 1750 1800 2000 3000 4000
Biên

độ

Phổ (V) 6 6.3 4.4 4.2 2 2 3 6.3 4.2 5

0.06-
Sóng (V) 0.2 0.2 0.2 0.2 0-0.1 0-0.2 0.18 0.2 0.2
0.1

• Đặc tính bộ lọc: Bộ lọc cho phép các thành phần tần số ngoài khoảng 1700-
1800Hz đi qua với biên độ gần như không đổi, các thành phần tần số trong
khoảng này có biên độ rất bé hoặc gần như bằng 0. Các thành phần tần số
cắt có biên độ suy giảm.
2. Tạo một xung vuông từ máy pháy sóng, lần lượt thay đổi tần số của tín
hiệu vào ghi nhận các thành phần tần số của ngõ ra. Giải thích tại sao có
dạng phổ này?

𝑓𝑖 (𝐻𝑧) 100 200 550 900

𝑓0 (𝐻𝑧) 112 224 560 912


320 608 1664
510
Giải thích Do sóng vuông là tổng của vô số tín hiệu tuần hoàn sin
(các hài), tần số của mỗi hài là 𝑓𝑘 = 𝑘𝑓0 (𝑘 = 1,2, … ),
và biên độ của hài cơ bản (𝑓0 ) có giá trị lớn nhất và biên
độ của các hài càng giảm dần khi tần số càng cao.
Với các sóng vuông có thành phân tần số cơ bản nằm
càng xa dải chắn (phía tần số thấp của dải chắn của bộ
lọc thông) thì càng dễ quan sát nhiều thành phần hài
của sóng vào do các thành phần này đang nằm hoàn
toàn trong dải thông của bộ lọc thông

5.2.2/ Bộ lọc IIR thông dải.

- Thiết kế, thực hiện và kiểm tra một bộ lọc IIR thông dải thuộc loại Chebyshev 2
với các thông số như sau:
• Bậc bộ lọc: 36.
• Tần số cắt dải chắn: 1600 và 2400 Hz
• Độ gợn dải chắn 100 dB
• Tần số lấy mẫu: 8 KHz
1. Đáp ứng cảu bộ lọc thiết kế dùng MATLAB:

❖ Giá trị của các phần tử sos


2 -3 2 -3275 12928

32768 63298 32768 3275 12928


32768 -51261 32768 -8791 15119

32768 51261 32768 8791 15119

32768 -39945 32768 -12349 18265

32768 39945 32768 12349 18265

32768 32302 32768 14310 21411

32768 -32302 32768 -14310 21411

32768 -27364 32768 -15280 24186

32768 27364 32768 15280 24186

32768 -24164 32768 -15730 26537

32768 24164 32768 15730 26537

32768 22117 32768 15963 28536

32768 -22117 32768 -15963 28536

32768 -20895 32768 -16162 30299

32768 20895 32768 16162 30299

32768 20322 32768 16437 31947

32768 -20322 32768 -16437 31947

❖ Kiểm tra bộ lọc với ngõ vào tín hiệu sin:


Tần số

(Hz)
100 500 1600 1800 2000 2300 2800 3000 3500 4000
Biên

độ
Phổ (V) 0 0 0.5 10 4 6 0 0 0 0

Sóng (mV) 0 0 100 150 200 260 50 50 50 0

• Đặc tính bộ lọc: Bộ lọc cho phép các thành phần tần số trong
khoảng 1600-2400Hz đi qua với biên độ gần như không đổi, các
thành phần tần số ngoài khoảng này có biên độ rất bé hoặc gần như
bằng 0. Các thành phần tần số cắt có biên độ suy giảm.
2. Tạo một xung vuông từ máy pháy sóng, lần lượt thay đổi tần số của tín hiệu vào
ghi nhận các thành phần tần số của ngõ ra. Giải thích tại sao có dạng phổ này?

𝑓𝑖 (𝐻𝑧) 100 200 550 900

𝑓0 (𝐻𝑧) 1800 1800 (lớn) 1800 (lớn) Các phổ


2200 2300 nhỏ

Giải thích Do sóng vuông là tổng của vô số tín hiệu tuần hoàn sin
(các hài), tần số của mỗi hài là 𝑓𝑘 = 𝑘𝑓0 (𝑘 = 1,2, … ),
và biên độ của hài cơ bản (𝑓0 ) có giá trị lớn nhất và biên
độ của các hài càng giảm dần khi tần số càng cao.

Với các sóng vuông có thành phần tần số cơ bản nằm


các xa dải thông của bộ lọc (phía tần số thấp của bộ lọc)
thì sẽ có ít các thành phần tần số có thể quan sát được
ở ngõ ra do các thành phần tần số có biền độ lớn (đa
phần là các hài bậc thấp của sóng vuông đó) nằm hầu
hết trong dải chắn của bộ lọc do đó sẽ bị suy hao rất
nhiều. Do đó đề có thể quan sát rõ được nhiều thành
phần tần số của sóng đầu vào hơn thì cần cho tần số cơ
bản càng gần dải thông của bộ lọc càng tốt.
BÀI 5:

ĐIỀU CHẾ PAM VÀ PWM

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: 26/07/2023

Điểm đánh giá


CBGD nhận
xét và ký tên

Chuẩn bị lý Báo cáo và kết Kiểm tra Kết quả


thuyết quả thí nghiệm
A. MỤC ĐÍCH THÍ NGHIỆM
Sử dụng kit DSK7613 thiết kế bộ điều chế PAM và PWM.
- Thực hiện điều chế PAM trên kit C6713 cho ứng dụng truyền dữ liệu.
- Thực hiện điều chế PWM trên kit C6713 cho ứng dụng điều khiển.
B. Thiết bị thí nghiệm
- Máy vi tính
- Kit C6713 DSK
- Máy phát sóng
- Bộ dây nối tín hiệu
C. Thực hiện mạch điều chế PAM trên kit C6713 DSK

1. PAM 4 mức:

 Các bước thực hiện điều chế PAM 4 mức:

1. Chọn Project → Rebuild All để biên dịch chương trình


2. Sau khi biên dịch thành công, nạp chương trình lên kit và chạy thử
3. Mở máy phát sóng lên và quan sát dạng sóng xuất ra
4. Chọn View → Graph → Time/Frequency. Thay đổi các tùy chọn trong cửa sổ :
Acquisition Buffer Size, Display Data Size, DSP Data Type, Sample Rate
5. Thử một vài giá trị và vẽ dạng sóng xuất ra

 Chương trình thực hiện:


// PAM
#include "DSK6713_aic23.h"
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
#include <math.h>
//Initialization:
int i_PAM;
int j_PAM;
int k;
int masked_value, output;
int data_4PAM[4] = {0x7FFF, 0x2AAA, -0x2AAB, -0x8000};
int out_buffer[256];
int i=0;
interrupt void c_int11() //interrupt service routine
{
int sample_data;
if (i_PAM==96)
{
sample_data = input_sample(); //inputs data
i_PAM=0;
j_PAM=0;
}
masked_value = sample_data & 0x0003;
output = data_4PAM[masked_value];
output_sample(output);
out_buffer[i++] = output;
if (i==256)
i = 0;
j_PAM++; //repeated output counter

if (j_PAM==12)
{
j_PAM=0;
sample_data = sample_data >> 2;
}
i_PAM++;
return;
}
void main()
{
i_PAM=0;

comm_intr(); //init DSK, codec, McBSP

while(1); //infinite loop

}
 Hình ảnh xuất ra:

II. Điều chế PAM 8 mức:


1. Thực hiện với sample_data = 0x0018

 Các bước thực hiện điều chế PAM 8 mức:

1. Mở project PAM4 ở folder C:\CCStudio\MyProject|PAM4\. Thay đổi một số


câu lệnh cho phù hợp với việc điều chế PAM 8 mức
+ Thay đổi int data_4PAM[4]={0x7FFF, 0x2AAA, -0x2AAB, -0x8000}…. →
int data_8PAM[8]={0x7FFF, 0x5B6D, 0x36DB, 0x1249, -0x1249, -0x36DB, -
0x5B6D, -0x7FFF}
+ Do là lấy 5 sample nên thay PAM==96 → PAM==60
+ Thay đổi masked_value=sample_data&0x0003 →
masked_value=sample_data&0x0007
+ Thay đổi sample_data >> 2 → sample_data >>3

2. Sau khi biên dịch thành công, nạp chương trình lên kit và chạy thử
3. Mở máy phát sóng lên và quan sát dạng sóng xuất ra
4. Chọn View → Graph → Time/Frequency. Thay đổi các tùy chọn trong cửa sổ :
Acquisition Buffer Size, Display Data Size, DSP Data Type, Sample Rate

5. Thử một vài giá trị và vẽ dạng sóng xuất ra.

Chương trình thực hiện: (kèm theo giải thích lệnh)

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Khởi động:

int i_PAM;

int j_PAM;

int k;

int masked_value, output;

int data_4PAM[8] = {0x7FFF,0x5B6D,0x36DB,0x1249,-0x1249,-0x36DB,-


0x5B6D,-0x7FFF}; //BANG TRA PAM 8 MUC
int out_buffer[256];

int i=0;

interrupt void c_int11() //NGAT

int sample_data;

if (i_PAM==60) //5 LẦN DỊCH X 12 LẦN XUẤT

sample_data = 0x0012; //DỮ LIỆU ĐẦU VÀO

sample_data=sample_data >>1; //THÀNH 15BIT CHIA HẾT CHO 3

i_PAM=0;

j_PAM=0;

masked_value = sample_data & 0x0007; //MẶT NẠ 3BIT

output = data_4PAM[masked_value]; //TRA MỨC TỪ BẢNG

output_sample(output); //XUẤT MỨC ĐIỆN ÁP

out_buffer[i++] = output;

if (i==256)

i = 0;

j_PAM++; //BỘ ĐẾM XUẤT

if (j_PAM==12) //KIỂM TRA QUÁ SỐ LẦN XUẤT


{

j_PAM=0;

sample_data = sample_data >> 3; //DỊCH PHẢI MẨU

i_PAM++;

return;

void main()

i_PAM=0;

comm_intr(); //khởi động DSK, codec,


McBSP

while(1); //lặp vô hạn

Quá trình thực thi lệnh:

Mẫu vào có giá trị 0x0005 (tức là 00000000 00000101). Mẫu này đầu tiên được
chứa vào biến sample_data.

- Đầu tiên: sample_data = 00000000 00000101


+ Sample_data dịch phải 1 bit → 00000000 00000010
+ Sample_data AND 0x0007 = 00000000 00000010 (=2)
+ data_4PAM(2) = 0x36DB → mức điện áp 0x36DB V được xuất ra
12 lần.
- Tiếp theo: sample_data dịch phải 3 bit → 00000000 00000000
+ Sample_data AND 0x0007 = 00000000 00000000 (=0)
+ data_4PAM(0) = 0x7FFF → mức điện áp 0x7FFF V được xuất ra
12 lần.
- Quá trình tiếp tục cho đến khi hết 16 bit của mẫu vào (thực chất 15 bit do
ban đầu đã dịch phải 1 bit), tức là dịch 5 lần, mỗi lần xuất 12 lần → số lần
xuất tổng cộng i_PAM = 5x12 = 60 lần. Sau đó sẽ đọc vào mẫu kế tiếp và
thực hiện điều chế.
-  Hình ảnh xuất ra :
I. Điều chế PAM 16 mức:

 Các bước thực hiện điều chế PAM 16 mức:

1. Mở project PAM4 ở folder C:\CCStudio\MyProject|PAM4\. Thay đổi một số


câu lệnh cho phù hợp với việc điều chế PAM 8 mức
+ Thay đổi int data_4PAM[4]={0x7FFF, 0x2AAA, -0x2AAB, -0x8000}…. →
int data_16PAM[16]={0x7FFF, 0x6EEE, 0x5DDD,……, -0x5DDE, -0x6EEF,
-0X8000}
+ Do là lấy 4 sample nên thay PAM==96 → PAM==48
+ Thay đổi masked_value=sample_data&0x0003 →
masked_value=sample_data&0x000F
+ Thay đổi sample_data >> 2 → sample_data >>4
2. Sau khi biên dịch thành công, nạp chương trình lên kit và chạy thử
3. Mở máy phát sóng lên và quan sát dạng sóng xuất ra
4. Chọn View → Graph → Time/Frequency. Thay đổi các tùy chọn trong cửa sổ :
Acquisition Buffer Size, Display Data Size, DSP Data Type, Sample Rate
5. Thử một vài giá trị và vẽ dạng sóng xuất ra

1. Thực hiện với sample_data = 0x0014


Chương trình thực hiện: (kèm theo giải thích lệnh)

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Khởi động:

int i_PAM;

int j_PAM;

int k;

int masked_value, output;

int data_4PAM[16] =
{0x7FFF,0x6EEE,0x5DDD,0x4CCC,0x3BBB,0x2AAA,0x1999,0x0888,-0x0889,-
0x199A,-0x2AAB,-0x3BBC,-0x4CCD,-0x5DDE,0x6EEF,-0x8000};

//BẢNG TRA PAM 16 MỨC

int out_buffer[256];

int i=0;

interrupt void c_int11() //NGẮT


{

int sample_data;

if (i_PAM==48) //4 LẦN DỊCH X 12 LẦN XUẤT

sample_data = 0x0014; //DỮ LIỆU VÀO

i_PAM=0;

j_PAM=0;

masked_value = sample_data & 0x000F; //MẶT NẠ 4 BIT

output = data_4PAM[masked_value]; //TRA MỨC

output_sample(output); //XUẤT MỨC ĐIỆN ÁP

out_buffer[i++] = output;

if (i==256)

i = 0;

j_PAM++; //BỘ ĐẾM XUẤT

if (j_PAM==12) //XUẤT QUÁ 12 LẦN

j_PAM=0;

sample_data = sample_data >> 4; //DỊCH PHẢI 4 BIT

}
i_PAM++;

return;

void main()

i_PAM=0;

comm_intr(); //KHAI BÁO

while(1); //LẶP VÔ HẠN

Quá trình thực thi lệnh:

Mẫu vào có giá trị 0x0014 (tức là 00000000 00010100). Mẫu này đầu tiên được
chứa vào biến sample_data.

- Đầu tiên: sample_data = 00000000 00010100


+ Sample_data AND 0x000F = 00000000 00000100 (=4)
+ data_4PAM(4) = 0x3BBB → mức điện áp 0x3BBB V được xuất ra
12 lần.
- Tiếp theo: sample_data dịch phải 4 bit → 00000000 00000001
+ Sample_data AND 0x000F = 00000000 00000001 (=1)
+ data_4PAM(1) = 0x6EEE → mức điện áp 0x6EEE V được xuất ra
12 lần.
- Quá trình tiếp tục cho đến khi hết 16 bit của mẫu vào, tức là dịch 4 lần, mỗi
lần xuất 12 lần → số lần xuất tổng cộng i_PAM = 4x12 = 48 lần. Sau đó sẽ
đọc vào mẫu kế tiếp và thực hiện điều chế.
-  Hình ảnh xuất ra:

-
-

You might also like