[tintuc]
Trong toán học, phép biến đổi Fourier rời rạc (DFT), đôi khi còn được gọi là biến đổi Fourier hữu hạn, là một biến đổi trong giải tích Fourier cho các tín hiệu thời gian rời rạc. Đầu vào của biến đổi này là một chuỗi hữu hạn các số thực hoặc số phức, làm biến đổi này là một công cụ lý tưởng để xử lý thông tin trên các máy tính. Đặc biệt, biến đổi này được sử dụng rộng rãi trong xử lý tín hiệu và các ngành liên quan đến phân tích tần số chứa trong một tín hiệu, để giải phương trình đạo hàm riêng, và để làm các phép như tích chập. Biến đổi này có thể được tính nhanh bởi thuật toán biến đổi Fourier nhanh (FFT).
Trong bài viết này sẽ hướng dẫn các bạn ứng dụng phép biến đổi FFT để phân tích âm thanh nút nhất DTFM.
 |
| Bản mã DTFM |
Code chương trình chính
% Lay du lieu
[a,fs]=audioread('DTMF_dialing.ogg');
%[a,fs]=audioread('AmThanh.m4a');
N=length(a);
t=[0:N-1]/fs;
plot(t,a);
% Thong so Tach Am
Tyle=0.2;
GioiHan=10;
dodai=N;
Y=0; X=0;
kiemtra=0;
soluong=1;
KT=0;
KTY=1;
giatri=1;
biendo=max(a)*Tyle;
%% TACH AM THANH
%Khu bo doan dau k am thanh
KTbatdau=0;
for i=1:dodai
if KTbatdau==0
if ((a(i)<-biendo)||(a(i)> biendo));
Batdau=i;
i=dodai;
KTbatdau=1;
end
end
end
%%
for i=Batdau:dodai
if ((a(i)<-biendo)||(a(i)> biendo));
kiemtra=0;
KT=0;
if KTY==0
X(soluong)=i;
KTY=1;
end
else
kiemtra=kiemtra+1 ;
if (kiemtra>GioiHan)&&(KT==0)
KT=1;
KTY=0;
giatri=i;
Y(soluong)=i-GioiHan+1;
soluong=soluong+1;
end
end
end
%Bo doan cuoi khong am thanh
soluong=soluong-1;
%Xu ly am thanh bat dau
if X(1)<1
X(1)=Batdau;
end
%% Giai Ma
for k=1:soluong
d1=a(X(k):Y(k));
Nl=length(d1);
t=[0:Nl-1]/fs;
y=fft(d1);
f=[0:Nl/2] * fs/Nl;
P= abs(y/Nl);
P2=P(1:Nl/2+1);
%ve dinh cua tan so
f(locs);
plot(f,P2,f(locs),pks,'or');
% TIM TAN SO
[pks, locs]=findpeaks(P2,'MinPeakHeight',0.04);
Tso=f(locs);
% Giai Ma
BoMa(k)=DoTanSo(Tso(1),Tso(2));
%plot(f,P2,f(locs),pks,'or')
end
BoMa
%% Xuat du lieu ket qua
A=string(BoMa);
Ma="";
for k=1:soluong
Ma=Ma+A(k);
if ((rem(k,10)==0)&&(k<soluong))
Ma=Ma+"-";
end
end
Ma
----
Code phân tích mã số
function Nut=DoTanSo(T1, T2)
Saiso=30;
Ma = [1209 1336 1477 1633 697 770 852 941];
TS =[1 2 3 10;4 5 6 11; 7 8 9 12; 14 0 15 13];
NutC=0;
for i=1:8
if ((T1 >Ma(i)-Saiso)&&(T1 <Ma(i)+Saiso))
NutC=i;
end
end
for i=1:8
if ((T2 >Ma(i)-Saiso)&&(T2 <Ma(i)+Saiso))
NutR=i;
end
end
if (NutC>4)
Nut=TS(NutC-4,NutR);
elseif (NutR>4)
Nut=TS(NutR-4,NutC);
else
Nut=100;
end
end[/tintuc]
Nhận xét
Đăng nhận xét