You are on page 1of 51

LAB 1: MATLAB

1.1 Giới thiệu về MATLAB


MATLAB là viết tắt của Matrix Laboratory, là một bộ phần mềm toán học của
hãng Mathworks để lập trình, tính toán số và có tính trực quan rất cao.

MATLAB làm việc chủ yếu với ma trận. Ma trận cỡ mxn là bảng chữ nhật gồm
mxn số được sắp xếp thành m hàng và n cột. MATLAB có thể làm việc với nhiều kiểu
dữ liệu khác nhau. Với chuỗi kí tự MATLAB cũng xem là một dãy các kí tự hay là dãy
mã số của các ký tự.

MATLAB dùng để giải quyết các bài toán về giải tích số, xử lý tín hiệu số, xử lý
đồ họa, … mà không phải lập trình cổ điển.

Hiện nay, MATLAB có đến hàng ngàn lệnh và hàm tiện ích. Ngoài các hàm cài
sẵn trong chính ngôn ngữ, MATLAB còn có các lệnh và hàm ứng dụng chuyên biệt trong
các Toolbox, đểmở rộng môi trường MATLAB nhằm giải quyết các bài toán thuộc các
phạm trù riêng. Các Toolbox khá quan trọng và tiện ích cho người dùng như toán sơ cấp,
xử lý tín hiệu số, xử lý ảnh, xử lý âm thanh, ma trận thưa, logic mờ,…

- Giao diện của phần mềm MATLAB khi bắt đầu chạy ứng dụng :

- Một số lệnh phố biến trong MATLAB hỗ trợ người dùng :

• info : hiển thị thông tin liên lạc về sản phẩm.

• demo : hiển thị các tùy chọn phổ biến trong MATLAB.
• help : trình bày một số câu lệnh ; help help giải thích cách help làm việc.

• helpbrowers : mở ra cửa sổ Help Window.

• lookfor: tìm kiếm thông tin qua help cho bởi một chuỗi xác định

1.2.Các toán tử

- Có 2 loại toán tử cơ bản là toán tử unary(toán tử một ngôi) và binary (toán tử


hai ngôi). Ví dụ kí hiệu “-” được hiểu toán tử một ngôi là giá trị âm và hiểu toán tử hai
ngôi là toán tử trừ .

- Dưới đây là một vài toán tử phổ biến được sử dụng với các biểu thức số học :

+ toán tử cộng

- giá trị âm , toán tử trừ

* toán tử nhân

/ toán tử chia lấy tử (9/3 = 3)

\ toán tử chia lấy mẫu (3/12 = 4)

^ toán tử lũy thừa

1.3.Vector và ma trận
Vector và ma trận được sử dụng để lưu tập các giá trị có cùng kiểu dữ liệu. Một vector có
thể là vector hàng hoặc vector cột. Một ma trận có thể được hình thành từ một bảng giá trị.

Ma trận cỡ mxn là bảng số chữ nhật gồm mxn số được sắp xếp thành m hàng và n cột:

• Nếu m=1 thì ma trận chuyển thành vector hàng.

• Nếu n =1 thì ma trận chuyển thành vector cột.

• Nếu m=n=1 thì ma trận trở thành một đại lượng vô hướng.

Một vector trong MATLAB được coi là mảng 1 chiều trong các ngôn ngữ khác. Một ma
trận được coi là mảng 2 chiều. Vì vậy trong MATLAB, thực hiện toán tử với vector và ma trận
thì được coi là các toán tử mảng.

Tạo vector hàng


- Có nhiều cách tạo biến vector hàng. Cách trực tiếp nhất là đặt các giá trị bạn muốn vào
trong dấu ngoặc vuông , và được phân cách bởi dấu cách hoặc dấu phẩy. Ví dụ:

>> v =[ 1 2 3 4]

v=

1234

>> v = [1,2,3,4]

v=

1234

Sử dụng colon operator (toán tử:) lấy từng giá trị trong khoảng xác định. Ví dụ:

>> vec = 1:5

vec =

12345

Chú ý: trong trường hợp này, cặp [] là không cần thiết để định nghĩa vector.

Với colon operator, một giá trị bước nhảy có thể xác định với 1 dấu 2 chấm khác, theo
mẫu sau (giá trị đầu: bước nhảy: giá trị cuối). Ví dụ:

>>nv = 1:2:9

Nv =

13579

Tương tự hàm linspace tạo ra 1 vector có n giá trị từ x đến y. Ví dụ tạo ra vector với 5
giá trị nằm cách đều trong khoảng từ 3 đến 15:

>>ls = linspace(3,15,5)

Ls =

3 6 9 12 15

Biến vector cũng có thể được tạo dựa trên các biến có sẵn. Ví dụ tạo một vector mới chứa
2 vector đã tạo ở trên:

>>newvee = [nv ls]

Newvee =
1 3 5 7 9 3 6 9 12 15

Đặt 2 vector cùng nhau giống như tạo một vector mới được gọi là concatenating (nối
ghép) vector.

Tạo vector cột

Để tạo vector cột , ta đặt các giá trị cần truyền vào trong cặp dấu ngoặc vuông và phân
cách bởi dấu chấm phẩy (;):

>> c=[1;2;3;4]

c=

Không thể sử dụng colon operator để tạo ra vector cột. Tuy nhiên có một cách khác là
chuyển hàng thành cột để tạo ra vector theo ý. Ví dụ:

>>r=1:3;

>>c=r’

c=

Tạo biến ma trận

Việc tạo biến ma trận thực chất là kết hợp biến vector hàng và cột lại với nhau. Ví
dụ biến mat được tạo bởi các giá trị cho trước:

>>mat=[4 3 1;2 5 6]

mat=

431

256
Yêu cầu để tạo ma trận là số giá trị trên các hàng phải bằng nhau. Nếu khác thì sẽ
hiển thị một thông báo lỗi, ví dụ:

>>mat=[3 5 7;1 2]

???error using => vertcat

Chúng ta có thể có thể tạo ma trận dựa trên colon operator cho các hàng. Ví dụ:

>>mat=[2:4;3:5]

mat=

234

345

Một cách khác để tạo ma trận không cần sử dụng dấu chấm phẩy để kết thúc một
hàng là nhấn phím Enter sau mỗi hàng. Ví dụ:

>>newmat=[2 6 88

33 5 2]

newmat=

2 6 88

33 5 2

Ma trận với các số ngẫu nhiên được tạo bằng cách sử dụng hàm rund và randint.
Hai đối số đầu tiên trong hàm randint xác định số hàng và cột của ma trận. Đối số cuối
xác định các giá trị ngẫu nhiên của ma trận nằm trong khoảng nào. Ví dụ tạo ma trận 2x4
với các giá trị nằm trong khoảng 10 đến 30:

>>randint(2,4,[10,30])

ans=

29 22 28 19

14 20 26 10

Đối với hàm rand, nếu truyền vào hàm 1 giá trị n thì ma trận nxn sẽ được tạo với các giá
trị ngẫu nhiên kiểu số thực:

>>rand(2)
ans=

0.2311 04860

0.6068 0.8913

Truyền vào 2 giá trị m, n thì ma trận mxn với các giá trị ngẫu nhiên số thực sẽ được tạo:

>>rand(1,3)

ans=

0.7621 0.4565 0.0185

MATLAB cũng cung cấp các hàm để tạo ra các ma trận đặc biệt. Ví dụ là hàm tạo ma
trận với các giá trị 0. Nếu truyền 1 đối số n thì ma trận nxn được tạo, 2 đối số m, n thì ma trận
mxn được tạo:

>>zeros(3)

ans=

0 0 0

0 0 0

0 0 0

>>zeros(2,4)

ans=

0 0 0 0

0 0 0 0

MATLAB scripts

Một script chứa các mã viết bằng MATLAB được lưu trữ trong một file. Nội dung trong
script được hiển thị trên cửa sổ Command Window. Script được thực thi hoặc chạy bằng cách
nhập vào tên file không chứa đuôi mở rộng.

Quy tắc của tên file giống như cho biến: bắt đầu bằng một chữ cái, sau đó có thể là chữ
cái, chữ số hoặc kí tự đặc biệt.

File script mặc định được lưu trong Work Directory. Ví dụ , ta tạo 1 file script1.m để tính
diện tích hình tròn. Ta viết mã vào script1.m như sau:
Sau khi lưu lại file, muốn hiển thị nội dung ra Command Window ta sử dụng lệnh type:

>>type script1
Radius=5
Radius=5
Area=pi*(radius^2)
Area=pi*(radius^)

Để chạy đoạn mã này, ta chỉ cần gõ tên của file script ra Command Window:

>>script1

Radius=

Area=

78,5398

Plot và Subplot

Lệnh plot trong MATLAB cho phép vẽ đồ thị từ dữ liệu là vector. Ví dụ nếu có
biến t là thời gian và y là tín hiệu, gõ lệnh plot(t,y); lập tức xuất hiện giao diện đồ thị của
t và y. Các hàm phổ biến cho plot:

• title (‘………….’) : chú thích tên đồ thị.

• xlabel ('……….’) : chú thích tên trục x của đồ thị.

• ylabel(‘………') : chú thích tên trục y của đồ thị.

• grid on : hiển thị lưới các ô vuông.

Để hiển thị nhiều đồ thị trên một màn hình, sử dụng hàm subplot. Hàm này gồm 3 đối số
(m,n,p), m và n chia màn hình ra thành m hàng và n cột. Đối số p xác định đồ thị nào xuất hiện
trước.

• subplot (…,….,…): hiện thị vùng muốn vẽ.

• stem (signal): vẽ chuỗi dữ liệu rời rạc.

• angle(x): argument của số phức a.

• real(x): phần thực của x ;

• imag(x): phần ảo của x.

• conj(x): số phức liên hợp của x.


• abs(x) :modun của số phức x.

1.6.Câu lệnh lựa chọn


• Biểu thức quan hệ

Các toán tử quan hệ trong MATLAB là:

Toán tử Định nghĩa


> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc
bằng
<= Nhỏ hơn hoặc
bằng
== Bằng
~= Không bằng

Các toán tử logic:

Toán tử Định nghĩa


|| Hoặc
&& Và
~ Không

• Câu lệnh IF

Câu lệnh if xác định 1 điều kiện hoặc 1 nhóm điều kiện xảy ra thì cho phép thực hiện các
câu lệnh. Cú pháp:

if condition

action

end

• Câu lệnh IF-ELSE và SWITCH

Câu lệnh if-else sử dụng để lựa chọn giữa 2 điều kiện. Cú pháp:

if condition

action 1

else
action 2

end

Câu lệnh switch được sử dụng để thay thế lệnh if-else lồng nhau. Cú pháp:

Switch switch_expression

case caseexp 1

action 1

case caseexp 2

action 2

case caseexp 3

action 3

%etc: there can be many of these

otherwise

action

end

1.7.Vòng lặp FOR


Vòng lặp for được sử dụng khi cần lặp lại 1 biểu thức nào đó dựa theo số lần cần lặp
được xác định trước. Cú pháp:

for loopvar=range

action

end

1.8 Nhâ ̣n xét.


Từ những giới thiê ̣u và mô ̣t số hướng dẫn cơ bản, ta có thể thấy MATLAB là mô ̣t phần
mềm với một môi trường tính toán số và lập trình mạnh mẽ. Hổ trợ hầu hết các phép toán( đă ̣c
biê ̣t hỗ trợ tốt ma trâ ̣n), các ngôn ngữ lâ ̣p trình phổ biến hiê ̣n nay như C, C++… và nhiều công
cụ khác cho những lĩnh vực, ngành khác nhau (xử lý tín hiệu số, xử lý đồ họa).
BÀI TẬP
Bài 1: Tạo biến ftemp nhập giá trị nhiệt độ Fahrenheit, chuyển đổi về nhiệt độ Celsius

Chương trình:
clc;
clear all;
ftemp=input('Nhap nhiet do F:')
Ctemp=(ftemp-32)*5/9

Kết quả:

Bài 2: Sử dụng toán tử colon, tạo các vector.

Chương trình:
clc;
clear all;
a=[3:6]
b=[1:0.5:3]
c=[5:-1:2]

Kết quả:
Bài 3: Sử dụng hàm linspace , tạo các vector.

Chương trình:
clc;
clear all;
x=linspace(4,8,3)
y=linspace(-3,-15,5)
z=linspace(9,5,3)

Kết quả:
Bài 4: Sử dụng toán tử colon tạo ma trận.

Chương trình:
clc;
clear all;
t=[7:-1:5;3:2:7]

Kết quả:

Bài 5: Vẽ đồ thị exp(x) với x thuộc [-2;2], bước nhảy là 0.1. Đặt title và label cho trục.

Chương trình:
clc;
clear all;
x=-11:0.1:11;
y=exp(x);
plot(x,y)
title('exp(x)')
xlabel('x')
ylabel('y')
grid on

Kết quả:
Bài 6: Vẽ đồ thị sin(x) với x thuộc [0;10]

a.Sử dụng 10 điểm trong khoảng này.

b.Sử dụng 100 điểm trong khoảng này.

Chương trình:
clc;
clear all;
x=linspace(-11*pi/2,11*pi/2,10);
y=sin(x);
subplot(2,1,1)
plot(x,y)
title('do thi sin 10 diem')
xlabel('x')
ylabel('sin(x)')
grid on
x=linspace(-11*pi/2,11*pi/2,100);
y=sin(x);
subplot(2,1,2)
plot(x,y)
title('do thi sin 100 diem')
xlabel('x')
ylabel('sin(x)')
grid on
Kết quả:

Bài 7: Một cơn bão là áp thấp, bão hoặc siêu bão được xác định bởi vận tốc gió trung
bình. Là áp thấp nếu sức gió dưới 38mph. Là bão nếu sức gió từ 39mph đến 73mph. Là siêu bão
nếu sức gió từ 74mph trở lên. Viết script cho phép người dùng nhập sức gió và hiển thị ra loại
bão.

Chương trình:
clc;
clear all;
speed =input('nhap toc do gio:')
if speed >=74
disp('do là sieu bao')
else if speed >=39
disp('do la bao')
else disp('do la ap thap nhiet doi')
end
end

Kết quả:
Bài 8: Tạo một ma trận 3x5. Thực hiện các yêu cầu:

 Tìm giá trị lớn nhất trong mỗi cột


 Tìm giá trị lớn nhất trong mỗi hàng
 Tìm giá trị lớn nhất trong cả ma trận

Chương trình:
clc;
clear all;
matrix = randint(3,5,[1,100])
maxMatrix=0;
for i=1:3
maxRow=0;
for j=1:5
if maxRow < matrix (i,j)
maxRow= matrix (i,j);
end
end
fprintf('\nso lon nhat hang %d : %d', i ,maxRow)
if maxMatrix < maxRow
maxMatrix = maxRow;
end
end
fprintf('\n so lon nhat ma tran: %d',maxMatrix)

for j=1:5
maxCol=0;
for i=1:3
if maxCol < matrix (i,j)
maxCol = matrix (i,j);
end
end
fprintf('\n so lon nhat cua hang thu %d :%d',j,maxCol)
end

Kết quả:
LAB 2: Chuỗi Fourier & Biến Đổi Fourier
1. Mục tiêu
Việc phân tích Fourier đóng vai trò quan trọng trong lý thuyết truyền thông. Mục đích chính
của bài thí nghiệm này là:

• Hiểu và thực hành tốt với chuỗi Fourier, kĩ thuật biến đổi Fourier và ứng dụng của nó
trong lý thuyết truyền thông.

• Học được cách triển khai kĩ thuật phân tích Fourier bằng MATLAB.

2. Giới thiệu
2.1 Chuỗi Fourier
Chuỗi Fourier (được đặt tên theo nhà toán học Joseph Fourier) của một hàm tuần hoàn là
một cách biểu diễn hàm đó dưới dạng tổng của các hàm tuần hoàn có dạng ejnx .

Chuỗi Fourier là việc mở rộng trực giao của tín hiệu tuần hoàn với chu kì T 0.Tín hiệu
tuần hoàn x(t) với chu kì T0 có thể được biểu diễn như sau:

Với xn được gọi là hệ số Fourier của tín hiệu x(t). Hệ số xn được tính như sau:

Loại chuỗi Fourier này được gọi chuỗi Fourier hàm mũ. Tần số f0=1/T0 được gọi là tần số
cơ bản của tín hiệu. Sóng thứ n có tần số fn=nf0.

Nếu x(t) là tín hiệu tuần hoàn giá trị thực thì tính chất liên hợp phức được thỏa mãn. Điều
này có nghĩa x-n=xn* với * là biểu thị của liên hợp phức. Ta có thể tính được hệ số âm bằng cách
lấy liên hợp phức của hệ số dương. Dựa theo kết quả này, ta có thể thấy được:

2.2.Biến đổi Fourier


Biến đổi Fourier là việc mở rộng của chuỗi Fourier cho một tín hiệu bất kì. Biến đổi
Fourier của tín hiệu x(t), kí hiệu là X(f) được định nghĩa:
Ngược lại , biến đổi Fourier ngược được định nghĩa:

Nếu x(t) là tín hiệu thực thì X(f) thỏa mãn tính chất liên hợp phức:

3.Lab work
3.1.Chuỗi Fourier
Các hàm hữu ích trong MATLAB:

• exp(n): hàm e mũ n.

• fft(x,N0): hàm biến đổi fourier nhanh của tín hiệu x .

• length(): tính độ dài của ma trận hoặc vector.

• conj: tính liên hợp phức của một số.

• abs(x): lấy giá trị tuyệt đối của x nếu x là số thực, lấy độ lớn của x nếu x là số phức.

• angle: tính pha theo radian của ma trận với các phần tử phức.

• stem: vẽ tín hiệu rời rạc.

• figure : đặt tên cho form.

Code minh họa dưới đây trình này cách sử dụng hàm fft để áp dụng đối với hệ số Fourier
lớn:
BÀI TẬP
Bài 1: Chuỗi Fourier

 Cân nhắc đồ thị cho biên độ và phổ pha. Thể hiện rằng điều có thể của tính đối
xứng là hiện tại trong mỗi loại phổ và tại sao? Đồ thị đồng thời cho biết sự có mặt
của chuỗi Fourier với tần số âm. Đâu là sự diễn dịch của nó ? nó có phải tần số
âm ? giải thích.
 Ta xét một tín hiệu tuần hoàn x(t).Tính toán và vẽ đồ thị biên độ rời rạc và phổ pha
của tín hiệu được xác định bởi: để làm điều này ,bạn cần sử dụng biến đổi
fourier nhanh trong matlab (dựa theo những chú ý bên dưới để thêm thông tin) cho
sự diễn giải của tín hiệu x(t). Số lượng của hàm điều hào điều hòa N0 để được sử
dụng nên là 32, chu kì T0 là pi, và bước nhảy là ts=T0/N0 tín hiệu ra bên nên
trong hai cửa sổ biểu đồ, cửa số đầu nên bao gồm x(t) ,cửa sổ 2 nên bao gồm cả 2
biên độ và phổ pha đối của một vector hàm điều hòa .Bạn có thể cần nhẫn và nhan
đề cho tất cả đồ thị. Bạn nhận xét gì từ những đồ thị.

Như một mô phỏng, những dòng code sau thể hiện làm thế nào để dùng fft đạt được
khải triển số.Bạn có thể học thuộc đoạn code này và cái tiến để hoàn tất công việc của
bạn.
Xn = fft(x,N0)/N0;
Xn=[conj(Xn(N0:-1:2)),Xn];
Xnmag = abs(Xn);
Xnangle = angle(Xn);
k=-N0/2+1:N0/2-1;
stem(k,Xnmag(N0/2+1:length(Xn)-N0/2));
stem(k,Xnangle(N0/2+1:length(Xn)-N0/2));

Chương trình:
N0=32;
T0=pi;
ts=T0/N0;
t=[0:ts:pi];
x=exp(-t/2);
subplot(3,1,1)
plot(t,x);
title('do thi cua tin hieu x(t)trong mien thoi gian');
xlabel('t');
ylabel('x(t)');
grid on;
Xn = fft(x,N0)/N0;
Xn=[conj(Xn(N0:-1:2)),Xn];
Xnmag = abs(Xn);
Xnangle = angle(Xn);
k=-N0/2+1:N0/2-1;
subplot(3,1,2)
stem(k,Xnmag(N0/2+1:length(Xn)-N0/2));
title('do thi bien do cua tin hieu x(t)trong mien tan so');
xlabel('t');
ylabel('Xnmag');
grid on;
subplot(3,1,3)
stem(k,Xnangle(N0/2+1:length(Xn)-N0/2));
title('do thi pha cua tin hieu x(t)trong mien tan so');
xlabel('t');
ylabel('Xnangle');
grid on;

Kết quả:
Nhận xét:

- Đồ thị có biên độ bằng 0 khi t<0 và t>2, bằng 1 khi 1<t<2, t+1 khi 0<t<1
- Biên độ càng lớn khi t càng xa giá trị 0
- Pha thay đổi theo thời gian

Bài 2: Biến đổi Fourier

 Bây giờ ta xem xét những tín hiệu x1(t) và x2(t) được mô tả dưới đây
 Vẽ đồ thị những tín hiệu và phổ liên quan trong MATLAB. Bạn có kết luận gì
từ kết quả có được? có gì khác biệt không?
 Bạn cần vẽ cả hai đồ thị thời gian trong biểu đồ .Tương tự bạn cần vẽ biên độ
và phổ pha cho 2 tín hiệu trong 1 cửa sổ đồ thị, chồng lên nhau. Cho pha, hiển
thị giá trị nhỏ bằng cách sử dụng lệnh axis. Bạn cũng cần chuẩn hóa biên độ và
giá trị pha, và bạn cần nhãn, tên và kẻ ô cho đồ thị. Xem cột x như là thước đo
đơn vị. Số điểm là 100 và có điểm bắt đầu là -5 ,kết thúc ở 5.

Chương trình:
clc;
clear all;
t=linspace(-5,5,100);
i=zeros(1,100);
L=length(t);
for i=1:L
if t(i)>=-1&&t(i)<=0
x1(i)=t(i)+1;
else if t(i)>0&& t(i)<=1
x1(i)=1;
else
x1(i)=0;
end
end
end
figure(2)
subplot(3,1,1);
plot(t,x1)
title('do thi cua ham x1 tren mien thoi gian')
xlabel('t')
ylabel('x1(t)')
grid on

X1=fft(x1);
X1=fftshift(X1);
X1mag=abs(X1);
X1angle=angle(X1);
F1=[-length(X1)/2:(length(X1)/2)-1];
subplot(3,1,2)
stem(F1,X1mag)
title('bien do cua x1 trong mien tan so')
grid on
subplot(3,1,3)
stem(F1,X1angle)
title('do thi pha cua x1 trong mien tan so')
grid on

for i=1:L
if t(i)>=0&&t(i)<=1
x2(i)=t(i);
else if t(i)>1&& t(i)<=2
x2(i)=1;
else
x2(i)=0;
end
end
end
figure(3)
subplot(3,1,1);
plot(t,x2)
title('do thi cua ham x2 tren mien thoi gian')
xlabel('t')
ylabel('x2(t)')
grid on

X2=fft(x2);
X2=fftshift(X2);
X2mag=abs(X2);
X2angle=angle(X2);
F2=[-length(X2)/2:(length(X2)/2)-1];
subplot(3,1,2)
stem(F2,X2mag)
title('do thi bien do cua x2 trong mien tan so')
grid on
subplot(3,1,3)
stem(F2,X2angle)
title('do thi pha cua x2 trong mien tan so')
grid on

figure(1)
subplot(2,1,1)
plot(t,x1)
title('do thi cua x1 trong mien thoi gian')
xlabel('t')
ylabel('x1(t)')
grid on
subplot(2,1,2)
plot(t,x2)
title('do thi cua x2 trong mien thoi gian')
xlabel('t')
ylabel('x2(t)')
grid on

Kết quả:
Nhận xét:
- Đồ thị có giá trị bằng 0 khi t<-3 và t>3, bằng 1 khi -3<=t<=3
- Biên độ càng lớn khi dạt ra 2 biên
- Pha tăng dần theo thời gian

Bài 3: Lặp lại những yêu cầu trên cho những tín hiệu sau, và báo cáo sự quan sát và nhận
xét:

Chương trình:
clc;
clear all;
t=linspace(-5,5,100);
i=zeros(1,100);
L=length(t);
for i=1:L
if t(i)>=-3&&t(i)<=3
x1(i)=1;
else
x1(i)=0;
end
end
figure(2)
subplot(3,1,1);
plot(t,x1)
title('do thi cua ham x1 tren mien thoi gian')
xlabel('t')
ylabel('x1(t)')
grid on

X1=fft(x1);
X1=fftshift(X1);
X1mag=abs(X1);
X1angle=angle(X1);
F1=[-length(X1)/2:(length(X1)/2)-1];
subplot(3,1,2)
stem(F1,X1mag)
title('bien do cua x1 trong mien tan so')
grid on
subplot(3,1,3)
stem(F1,X1angle)
title('do thi pha cua x1 trong mien tan so')
grid on

for i=1:L
if t(i)>=-1&&t(i)<=1
x2(i)=1;
else
x2(i)=0;
end
end
figure(3)
subplot(3,1,1);
plot(t,x2)
title('do thi cua ham x2 tren mien thoi gian')
xlabel('t')
ylabel('x2(t)')
grid on

X2=fft(x2);
X2=fftshift(X2);
X2mag=abs(X2);
X2angle=angle(X2);
F2=[-length(X2)/2:(length(X2)/2)-1];
subplot(3,1,2)
stem(F2,X2mag)
title('do thi bien do cua x2 trong mien tan so')
grid on
subplot(3,1,3)
stem(F2,X2angle)
title('do thi pha cua x2 trong mien tan so')
grid on

figure(1)
subplot(2,1,1)
plot(t,x1)
title('do thi cua x1 trong mien thoi gian')
xlabel('t')
ylabel('x1(t)')
grid on
subplot(2,1,2)
plot(t,x2)
title('do thi cua x2 trong mien thoi gian')
xlabel('t')
ylabel('x2(t)')
grid on

Kết quả:
Nhận xét:

- Đồ thị bằng 0 khi t>1 và t<-1, bằng 1 khi -1<=t<=1


- Biên độ dao động không đáng kể
- Pha tăng dần theo thời gian

Nhận xét chung:

Ý nghĩa chuổi Fourier: dùng để phân tích được sự phân bố năng lượng của tín hiê ̣u và
qua phân tích phổ thì ta biết được năng lượng tâ ̣p trung chủ yếu ở tần số thấp. Từ đó có thể đưa
ra các phương pháp thiết kế bô ̣ lọc thích hợp để lấy được năng lượng của tín hiê ̣u tối ưu nhất.
LAB 3: Xây dựng tín hiệu và phân tích hệ thống
1. Mục tiêu:

Việc tìm hiểu các dạng tín hiệu và phân tích các hệ thống đóng vai trò quan trọng trong lý
thuyết truyền thông. Mục đích chính của bài thí nghiệm này là:

- Hiểu và thực hành tốt với các câu lệnh tạo định dạng các tín hiệu trên MATLAB
- Học được cách sử dụng SIMULINK trên MATLAB để phân tích các hệ thống
2. Cơ sở lý thuyết:
Tín hiệu là một tập hợp thông tin hay dữ liệu, được biểu diễn dưới dạng hàm của một hay
nhiều biến độc lập. Tín hiệu có thể được phân loại dựa vào các đặc điểm khác nhau của nó:

- Tín hiệu liên tục và tín hiệu rời rạc


- Tín hiệu biên độ liên tục và tín hiệu lượng tử hóa
- Tín hiệu tuần hoàn và không tuần hoàn
- Tín hiệu nhân quả và phi nhân quả
- Tín hiệu năng lượng và tín hiệu công suất
- Tín hiệu xác định và tín hiệu ngẫu nhiên
- Tín hiệu chẵn lẻ

Một số tín hiệu cơ bản:

- Tín hiệu hằng số

F(t)=a với mọi t

- Tín hiệu bước nhảy đơn vị

- Tín hiệu chữ nhật đơn vị

- Tín hiệu dốc đơn vị

- Tín hiệu xung đơn vị


- Tín hiệu mũ

- Tín hiệu sin, cos

Học sinh thực hiện các nhiệm vụ sau:

Bài 1:

a. Vẽ tín hiệu hẳng số, tín hiệu xung đơn vị, tín hiệu chữ nhật, dốc đơn vị với n trong
khoảng [-10,10]
b. Vẽ tín hiệu sin cos với tần số f=100 và góc pha bằng 45

Bài 2:

Vẽ các tín hiệu sau:

Bài 3: tạo tần số x(n) gồm các thành phần tần số thấp và cao.

Với n=40, f1=0.02 là tần số thấp, f2=40 là tần số cao (do giáo viên hướng dẫn cho).
Thực hành với SIMULINK
Simulink chứa thư viện rất phong phú, bài thí nghiệm này chỉ có thể đề cập đến những gì
gọi là cơ bản nhất. Từ đó, sinh viên có thể tự mình nghiên cứu và phát triển tiếp.

1.1. Khởi động simulink

>>simulink

Hoặc nhấp vào biểu tượng simulink trên thanh menubar của matlab

Thư viện simulink hiện ra như hình:

Cửa sổ chính thư viện SIMULINK

Trước tiên, sinh viên hãy nhấp chuột vào thanh cuộn của thư viện để có cái nhìn thân thiện hơn
về simulink.

Từ đây có thể tạo mô hình từ simulink

ƒ + Nhấp chuột vào biểu tượng New của thư viện simulink

ƒ + Chọn: File – New – Model trong Menu của thư viện simulink

ƒ + Chọn: File – New – Model trong cửa sổ lệnh của matlab


Môi trường soạn thảo của simulink

1.2. Thao tác trong cửa sổ soạn thảo

Cửa sổ soạn thảo này cho phép ta nhấp – kéo – thả vào từng khối chức năng trong thư viện
simulink

Ví dụ, đặt khối ‘Sine wave’ trong thư viện simulink library

Sau khi đặt tất cả các khối cần thiết của mô hình, ta nối chúng lại bằng cách nhấp – giữ và
kéo một đường từ ngõ ra của khối này đến ngõ vào của khối khác rồi thả phím trái chuột,
một kết nối sẽ được thiết lập.

Có 8 thư viện chính của simulink được phân loại như sau:

- Continuous: hệ thống tuyến tính và liên tục.


- Discrete: hệ thống tuyến tính gián đoạn.
- Nonlinear: mô hình hóa những phần tử phi tuyến.
- Source: các khối nguồn tín hiệu.
- Sink: các khối thu tín hiệu.
- Function & table: các hàm bậc cao matlab
- Math: các khối của simulink và các hàm toán học tương ứng của matlab
- Signals & systems: các khối liên hệ tín hiệu và hệ thống con.

Tạo một sơ đồ đơn giản:

Để làm quen với simulink, ta bắt đầu với một mô hình đơn giản: phân tích hàm quá độ của
một khâu bậc hai với hàm truyền:

Một sơ đồ simulink đơn giản

Xem kết quả bằng cách mở khối scope như hình:

Mô phỏng hệ thống sau trong simulink, hàm truyền của hệ hở là:


BÀI TẬP
Bài 1:

a. Vẽ tín hiệu hẳng số, tín hiệu xung đơn vị, tín hiệu chữ nhật, dốc đơn vị với n trong
khoảng [-10,10]
b. Vẽ tín hiệu sin cos với tần số f=100 và góc pha bằng 45

Câu a:

Chương trình:
x=linspace(-10,10,100)
y=4
subplot(2,2,1)
plot(x,y)
title('do thi ham hang so')
xlabel('x')
ylabel('y')

t=linspace(-10,10,100);
i=zeros(1,100);
L=length(t);
for i=1:L
if t(i)>=-1/2&t(i)<=1/2
x1(i)=1;
else
x1(i)=0;
end
end

subplot(2,2,2)
plot(t,x1)
title('do thi tin hieu chu nhat')
xlabel('x')
ylabel('y')
grid on

t1=linspace(-10,10,1000);
L=length(t1);
for i=1:L
if t1(i)>=-1/10&t1(i)<=1/10
x2(i)=50;
else
x2(i)=0;
end
end

subplot(2,2,3)
plot(t1,x2)
title('do thi tin hieu xung don vi')
xlabel('x')
ylabel('y')
grid on

t2=linspace(-10,10,100);
i=zeros(1,100);
L=length(t2);
for i=1:L
if t2(i)>=0
x3(i)=t(i);
else
x3(i)=0;
end
end

subplot(2,2,4)
stem(t,x3)
title('do thi tin hieu doc don vi')
xlabel('x')
ylabel('y')
grid on

câu b:
t=linspace(-4,4,200)
y1=3*sin(2*pi*100*t+pi/4)
y2=3*cos(2*pi*100*t+pi/4)
subplot(2,1,1);
plot(t,y1)
title('do thi ham sin')
xlabel('t')
ylabel('y')
grid on

subplot(2,1,2);
plot(t,y2)
title('do thi ham cos')
xlabel('t')
ylabel('y')
grid on

Kết quả:

Nhận xét:

- Tín hiệu hàm Sin: đối xứng qua trục tung.


- Tín hiệu hàm Cos: đối xứng qua gốc tọa độ.

Bài 2:

Chương trình:
t=linspace(-4,4,200)
x1=exp(0.8*t)
subplot(3,1,1)
plot(t,x1)
title('tin hieu cau a')
xlabel('t')
ylabel('y')
grid on

x2=exp((1/15+(j*3*pi)/8)*t);
subplot(3,1,2)
stem(t,x2)
title('tin hieu cau b')
xlabel('t')
ylabel('y')
grid on

x3=exp((-1/6+(j*pi)/6)*t);
subplot(3,1,3)
stem(t,x3)
title('tin hieu cau c')
xlabel('t')
ylabel('y')
grid on

Kết quả:
Nhận xét:

Bài 3:

Chương trình:
n=linspace(0,40,500)
flow=0.05;
fhigh=300;
x=cos(2*pi*flow*n)+cos(2*pi*fhigh*n)

plot(n,x)
title('tin hieu x(n)')
xlabel('n')
ylabel('x(n)')
grid on

Kết quả:

Nhận xét:
Bài 4:

Kết quả:

Nhận xét: Hệ thống ổn định.


LAB 4: LỌC TÍN HIỆU TUẦN HOÀN
1. Giới thiệu

Trong Lap 4, Trong bài lab này ta sẽ tìm hiểu về tác dụng của bộ lọc tín hiệu sử dụng hệ
thống LTI thực hiện trong miền tần số. Trong bài lap này chúng ta sẽ nghiên cứu về 2 bô ̣ lọc đó
là: bô ̣ lọc thông cao và lọc thông thấp. Lọc thông cao là lọc tần số thấp chỉ cho các tần số cao đi
qua.Lọc thông thấp thì ngược lại.

2. Các câu lệnh và nguồn dữ liệu của MATLAB

Một số câu lệnh dùng trong lab:

- fff: biến đổi Fourier thuận (miền thời gian sang miền tần số)
- iff: biến đổi Fourier ngược (miền tần số qua miền thời gian)
- tffshift: dịch chuyển tần số zero vào trung tâm phổ
- sound: âm thanh nghe chưa định tỉ lệ (clip đầu vào [-1,1]
- soundsc: âm thanh thu nhỏ (quy mô/bình thường hóa đầu vào [-1,1]
- wavread: đọc, định dạng files WAV, tỉ lệ lấy mẫu của files WAV cũng có thể được lấy ra
bằng câu lệnh như sau:
[x,Fs] = wavread('filename.wav')
(Với x là vector âm thanh và Fs là tần số lấy mẫu).
3. Chuyển đổi tín hiệu trong miền tần số và ngược lại

Trong Matlab thì biến đổi Fourier tín hiệu liên tục miền thời gian không thể thực hiện
một cách chính xác. Những sự khác biệt quan trọng giữa biến đổi Fourier rời rạc trong máy tính
và biến đổi Fourier liên tục là : dải tần số hữu hạn và các tần số mẫu rời rạc. Đô ̣ mịn dải tần số
của tín hiệu sau khi biến đổi sẽ phụ thuộc vào tần số lấy mẫu của tín hiệu. Tần số lấy mẫu càng
lớn thì phổ càng mịn.

Ta xét ví dụ trong ở trong Lap 3: Tín hiệu có tần số lấy mẫu là Fs = 8000. Có nghĩa là dải
tần số từ [-4000,4000]Hz. Độ phân giải tần số phụ thuộc vào độ dài của các tín hiệu (mà cũng là
chiều dài của biểu diễn tần số).

Ví dụ:

>>load fall %Tải file


>>x = fall;
>>X = fft(x)

Lệnh fft cho ra tần số không nằm ở trung tâm.Để có thể hiển thị kết quả trong miền tần
số : một là hiển thị một nửa kết quả ( phần tần số dương), hai là hiển thị cả 2 vùng tần số bằng
lệnh fftshift. Lệnh fftshift để dịch phổ vào trung tâm, đối xứng tại 0. Ta sử dụng abs để hiển thị
biên độ của phổ tín hiệu. Lưu ý rằng vì biến đổi Fourier của tín hiệu là giá trị phức, abs được sử
dụng để xem độ lớn (biên độ) của phổ.

Đoạn code sau thực hiện cả 2 cách:

>> N = length(x); %Xác định kích thước của x


>>pfreq = [0:N/2]* Fs/N; %Khoảng tần số
>>Xpos = X(1:N/2+1) ; % Khoảng giá trị x chạy
>>plot(pfreq,abs(Xpos)) ; % Vẽ đồ thị
>> figure;
>>freq = [-(N/2+1) :N/2]*Fs/N; % Tần số đồ thị
>>plot(freq,abs(fftshift(X)));

Sau khi thay đổi tín hiệu trong miền tần số,lệnh ifft được dùng để chuyển về lại miền thời
gian nếu mong muốn.

>>xnew = real(ifft(X));

Chú ý: Chúng ta cần dùng lệnh “real” vì biến đổi Fourier ngược cho ra giá trị hỗn hợp

4. Bộ lọc thông thấp

Bộ lọc(filter): là một quá trình lọc những dữ liệu không cần thiết, loại bỏ đi những dữ
liệu này và chỉ giữ lại những thứ mà mình muốn.

Bộ lọc thông thấp là bộ lọc chỉ cho phép tín hiệu hoạt động từ 0 Hz -> tần số cắt (cutoff)
của nó, các tín hiệu tần số cao sẽ được lọc đi.

Một bộ lọc thông thấp lý tưởng loại bỏ các tần số cao hoàn toàn.

( w )= 1 ,∨w∨≤ B
H ideal
L
{ 0 ,∨w∨≥ B

Một bộ lọc thông thấp thực tế thường có giá trị thấp nhưng không bằng 0 với | H L (w) | ở
tần số cao và dần dần giảm độ lớn khi tần số tăng. Bộ lọc thông thấp đơn giản nhất(ít hiệu quả
nhất) được cho bởi:
α
H L(w)=
α + jw

với α là tần số cắt


Bộ lọc thông thấp có thể được dùng trong Matlab bằng cách sử dụng phép biến đổi
Fourier. Phép nhân trong miền tần số là các hoạt động tương tự như chập trong miền thời gian.
Nếu ta có cả hai tín hiệu và bộ lọc ở miền tần số thì ta có thể nhân chúng để tìm được đầu ra
của hệ thống:

y(t)=x(t)*h(t)

Y(ω)=X (ω) H( ω)

Ví dụ về cách sử dụng Matlab để thực hiện một bộ lọc thông thấp với tín hiệu vào là x,
các tần số cắt của bộ lọc được biểu diễn bằng hằng số a. Ta cần xác định H trong miền tần số.

>> load fall % tải tín hiệu


>>x = fall;
>>X = fft(x); % biến đổi tín hiệu x sang miền tần số

>>N = length(X);

>>a = 100*2*pi;
>>w = (-N/2+1:(N/2)); % Vector tần số trung tâm (rad / s)
>>H = a ./ (a + i*w); % Tạo lấy mẫu trung tâm của H
>>plot(w*Fs/N,abs(H)) % w chuyển đổi trở lại Hz.
- Đồ thị sẽ chỉ ra các dạng đáp ứng tần số của hệ thống mà ta đã sử dụng.
>>Hshift = fftshift(H); %H không nằm ở trung tâm
>> Y = X .* Hshift'; %Bộ lọc tín hiệu
Chú ý: Khi nhân hai vector cần chú ý kích thước của hai vector có bằng nhau hay chưa.

Ta sẽ có đầu ra của hệ thống trong miền tần số, dùng Fourier ngược để chuyển về miền
thời gian. Nghe âm thanh gốc và sửa đổi và nghe sự khác biệt. Sử dụng tần số lấy mẫu Fs.

>> y = real(ifft(Y));
>>sound(x, Fs) ) % âm thanh gốc
>> sound(y, Fs) % âm thanh được lọc qua thông thấp

Bộ lọc làm giảm âm thanh của tín hiệu mà khi nghe chỉ có thể sử dụng lệnh sound mà
không dùng được lệnh soundsc tự động chia tỉ lệ.

Chú ý: Đôi khi, bạn có thể khuếch đại tín hiệu để nó có chiều cao giống như tín hiê ̣u ban
đầu.
>> y = y * (max(abs(x))/max(abs(y)));
Ví dụ 1: lọc thông thấp âm thanh castanets44m.way sử dụng hàm audioread, với tần số
cắt là a=500*2*pi, vẽ phổ biên độ và đồ thị miền thời gian của tín hiệu trước và sau khi lọc
thông thấp.

Ví dụ 2: tạo tín hiệu x(t) use lệnh sau: x= repmat([zeros(1,99),1]); lọc thông thấp tín hiệu
với tần số cắt là 20, vẽ đồ thị trên miền thời gian và phổ biên độ cảu tín hiệu gốc và tín hiệu gốc
và tín hiệu đã lọc thông thấp.

5. Bộ lọc thông cao

Bộ lọc thông cao là bộ lọc chỉ cho phép tín hiệu hoạt động từ tần số cắt của nó đến vô
cùng các tín hiệu tần số thấp nhỏ hơn tần số cắt sẽ được lọc đi.

Một bộ lọc thông cao lý tưởng loại bỏ hoàn toàn các tần số thấp.

0|w|<B
H ideal
H ( w )={1∨w∨≥ B

Bộ lọc thông cao thực tế thường có giá trị thấp nhưng không bằng 0 với H L (w) ở tần số
thấp và dần dần tăng độ lớn khi tần số tăng. Mạch lọc thông cao được cho bởi:
α
H ❑H ( w )=1−H L ( w )=1−
α + jw

Mạch lọc này có thể thực hiện giống như mạch lọc thông thấp. Với α là tần số cắt.

Ví dụ 3: lọc thông cao tín hiệu file castanets44m.way , sử dụng tần số cắt là
a=2000*2*pi, vẽ phổ biên độ và đồ thị trên miền tần số của tín hiệu gốc và tín hiệu lọc thông
cao.

Ví dụ 4: tín hiệu mixed.wav là tín hiệu được tạo bởi bassdrum.wav, hatclosed.wav,
shake.mat. Đầu tiên lọc tín hiệu chỉ để lấy tiếng, sau đó tín hiệu để chỉ lấy được tiếng kèn.

Ví dụ 5: trộn tín hiệu hai file rainstick.mat với mixedsig = rainstick*10+shake.mat, lọc
tín hiệu sao cho loại bỏ tiếng mưa và lấy được tiếng kèn.

BÀI TẬP
Bài 1:
clc
[x,Fs] = audioread('castanets44m.wav');
X = fft(x);
N = length(X);
a = 500*2*pi;
w = (-N/2+1:(N/2));
H = a ./ (a + 1i*w);
Hshift = fftshift(H);
Y = X .* Hshift';
y = real(ifft(Y));
sound(x, Fs)
sound(y, Fs)
subplot(2,1,1)
plot(w*Fs/N,abs(fftshift(X)))
title('tin hieu goc')
xlabel('w')
ylabel('X')
grid on
subplot(2,1,2)
plot(w*Fs/N,abs(fftshift(Y)))
title('tin hieu da loc')
xlabel('w')
ylabel('Y')
grid on

Nhận xét: những tín hiệu có |w|>=500 bị lọc bớt đi và những tín hiệu có |w|=500 giữ
nguyên độ lớn

Bài 2:
clc
x = repmat([zeros(1, 99) 1], 1, 5);
X = fft(x);
N = length(X);
a = 20;
w = (-N/2+1:(N/2));
H = a ./ (a + 1i*w);
Hshift = fftshift(H);
Y = X .* Hshift;
y = real(ifft(Y));
subplot(2,1,1)
plot(w,abs(fftshift(x)))
title('tin hieu ban dau trong mien thoi gian')
xlabel('w')
ylabel('x')
grid on
subplot(2,1,2)
plot(w,abs(fftshift(y)))
title('tin hieu loc trong mien thoi gian')
xlabel('w')
ylabel('x')
grid on

Nhận xét: tín hiệu sau khi lọc bị phình ra tại những điểm gần |w|=100n với n=0,1,2,…

Bài 3:
clc
[x,Fs] = audioread('castanets44m.wav');
X = fft(x);
N = length(X);
a = 2000*2*pi;
w = (-N/2+1:(N/2));
H = 1-(a ./ (a + 1i*w));
Hshift = fftshift(H);
Y = X .* Hshift';
y = real(ifft(Y));
sound(x, Fs)
sound(y, Fs)
subplot(2,1,1)
plot(w*Fs/N,abs(fftshift(X)))
title('tin hieu goc')
xlabel('w')
ylabel('X')
grid on
subplot(2,1,2)
plot(w*Fs/N,abs(fftshift(Y)))
title('tin hieu da loc')
xlabel('w')
ylabel('Y')
grid on

Nhận xét:

Bài 4:
clc
[x,Fs] = audioread('mixed.wav');
X = fft(x);
N = length(X);
a = 2000;
w3 = (-N/2+1:(N/2));
w4=w3.*Fs/N;
H = 1-(a ./ (a + 1i*w4));
Hshift3 = fftshift(H);
a2 = 5000;
w5 = (-N/2+1:(N/2));
w6=w5.*Fs/N;
H5 = 1-(a2 ./ (a2 + 1i*w6));
Hshift5 = fftshift(H5);
a1 = 6000;
w8 = (-N/2+1:(N/2));
w7=w8.*Fs/N;
H7 = 1-(a1 ./ (a1 + 1i*w7));
Hshift7 = fftshift(H7);
Y = X .* Hshift3'.* Hshift5'.* Hshift7';
y = real(ifft(Y));
y = y * (max(abs(x))/max(abs(y)));

a33 = 100;
w33 = (-N/2+1:(N/2));
w44=w33.*Fs/N;
H51 = a33 ./ (a33 + 1i*w44);
Hshift51 = fftshift(H51);
a11 = 50;
w51 = (-N/2+1:(N/2));
w61=w51.*Fs/N;
H52 = a11 ./ (a11 + 1i*w61);
Hshift55 = fftshift(H52);
a12 = 5;
w16 = (-N/2+1:(N/2));
w15=w16.*Fs/N;
H54 = a12 ./ (a12 + 1i*w15);
Hshift54 = fftshift(H54);
Y1 = X .* Hshift51' .* Hshift55' .* Hshift54';
y1 = real(ifft(Y1));
y1 = y1 * (max(abs(x))/max(abs(y1)));
sound(x, Fs)
sound(y1, Fs)
sound(y, Fs)
subplot(3,1,1);
plot(w5,abs(fftshift(X)))
title('tin hieu ban dau')
grid on
subplot(3,1,2);
plot(w5,abs(fftshift(Y)))
title('tin hieu khi loc thong cao')
grid on
subplot(3,1,3);
plot(w33,abs(fftshift(Y1)))
title('tin hieu khi loc thong thap')
grid on

Nhận xét:

Bài 5:
clc
load rainstick
load shake
mixedsig = shake + 10*rainstick;
x=mixedsig;
a=1000*pi;
Fs=8000;
X=fft(x);
N=length(x);
w = (-N/2+1:(N/2));
w1=w.*Fs/N;

H = 1-(a ./ (a + 1i*w));
Hshift = fftshift(H);
Y = X .* Hshift';
y = real(ifft(Y));

a1=500;
w2 = (-N/2+1:(N/2));
w3=w2.*Fs/N;
H = a ./ (a + 1i*w);
Hshift = fftshift(H);
Y1 = X .* Hshift';
y1 = real(ifft(Y1));

subplot(3,1,1)
plot(w,abs(fftshift(X)))
title('tin hieu ban dau')
grid on
subplot(3,1,2)
plot(w,abs(fftshift(Y)))
title('tin hieu loc thong cao')
grid on
subplot(3,1,3)
plot(w,abs(fftshift(Y1)))
title('tin hieu loc thong thap')
grid on

Nhận xét:

You might also like