Matlab语音信号频谱分析代码实现
生活随笔
收集整理的這篇文章主要介紹了
Matlab语音信号频谱分析代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
clear all;
clc;
[filename,filepath]=uigetfile('.wav','Open wav file');
[y,fs,nbits]=wavread([filepath,filename]); %從電腦文件夾選擇wav音頻文件b=menu('請選擇選項','原始信號采樣后時域圖和頻譜圖','FIR濾波器','IIR濾波器','退出');
while(b~=4)
if b==1temp=menu('請選擇選項','播放原始語音','原始語音時域圖','原始語音做FFT變換后頻譜圖','返回');if temp==1%播放語音sound(y);elseif temp==2%畫出原始語音時域圖figure(11) plot(y);xlabel('時間(ms)'); ylabel('幅值'); title('原始語音時域圖');elseif temp==3%畫出原始語音做FFT變換后頻譜圖Y1=fft(y);Y=abs(Y1);figure(12)plot(Y);xlabel('頻率'); ylabel('幅值');title('原始語音做FFT變換后頻譜圖');elseend
end
if b==2temp=menu('請選擇選項','FIR低通濾波器','FIR高通濾波器','FIR帶通濾波器','返回');if temp==1%FIR低通濾波器fs=10000;wp=2*pi*1000/fs;wst=2*pi*1200/fs;Rp=1;Rs=100;wdelta=wst-wp;N=ceil(8*pi/wdelta); %取整wn=(wp+wst)/2;[b,a]=fir1(N,wn/pi,hamming(N+1)); %選擇窗函數,并歸一化截止頻率figure(21)freqz(b,a,512);title('FIR低通濾波器');y1=filter(b,a,y);figure(22)subplot(2,1,1)plot(y)title('FIR低通濾波器濾波前的時域波形');xlabel('時間(ms)'); ylabel('幅值'); subplot(2,1,2)plot(y1);title('FIR低通濾波器濾波后的時域波形');xlabel('時間(ms)'); ylabel('幅值'); sound(y1,8000); %播放濾波后的語音信號F0=fft(y1,1024);f=fs*(0:511)/1024;figure(23)y2=fft(y,1024);subplot(2,1,1);plot(f,abs(y2(1:512)));title('FIR帶通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)F2=plot(f,abs(F0(1:512)));title('FIR低通濾波器濾波后的頻譜');xlabel('頻率/Hz');ylabel('幅值');elseif temp==2%FIR高通濾波器fs=22050;wp=2*pi*5000/fs;wst=2*pi*3000/fs;Rp=1;Rs=100;wdelta=wp-wst;N=ceil(8*pi/wdelta); %取整wn=(wp+wst)/2;[b,a]=fir1(N,wn/pi,'high'); figure(24)freqz(b,a,512);title('FIR高通濾波器');y1=filter(b,a,y);figure(25)subplot(2,1,1)plot(y)title('FIR高通濾波器濾波前的時域波形');xlabel('時間(ms)'); ylabel('幅值');subplot(2,1,2)plot(y1);title('FIR高通濾波器濾波后的時域波形');xlabel('時間(ms)'); ylabel('幅值');sound(y1,8000); %播放濾波后的語音信號F0=fft(y1,3000);f=fs*(0:511)/1024;figure(26)y2=fft(y,1024);subplot(2,1,1);plot(f,abs(y2(1:512)));title('FIR高通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)plot(f,abs(F0(1:512)));title('FIR高通濾波器濾波后的頻譜')xlabel('頻率/Hz');ylabel('幅值');elseif temp==3%FIR帶通濾波器fs=22050;wp1=2*pi*1200/fs;wp2=2*pi*3000/fs;ws1=2*pi*1000/fs;ws2=2*pi*3200/fs;Rp=1;Rs=100;wp=(wp1+ws1)/2;ws=(wp2+ws2)/2;wdelta=wp1-ws1;N=ceil(8*pi/wdelta); %取整wn=[wp ws];[b,a]=fir1(N,wn/pi,'bandpass'); figure(27)freqz(b,a,512);title('FIR帶通濾波器');y1=filter(b,a,y);figure(28)subplot(2,1,1)plot(y);xlabel('時間(ms)'); ylabel('幅值'); title('FIR帶通濾波器濾波前的時域波形');subplot(2,1,2)plot(y1);title('FIR帶通濾波器濾波后的時域波形');xlabel('時間(ms)'); ylabel('幅值'); sound(y1,8000); %播放濾波后的語音信號F0=fft(y1,3000);f=fs*(0:511)/1024;figure(29)y2=fft(y,1024);subplot(2,1,1);plot(f,abs(y2(1:512)));title('FIR帶通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)plot(f,abs(F0(1:512)));title('FIR帶通濾波器濾波后的頻譜')xlabel('頻率/Hz');ylabel('幅值');elseend
endif b==3temp=menu('請選擇選項','IIR低通濾波器','IIR高通濾波器','IIR帶通濾波器','返回');if temp==1%IIR低通濾波器fs=22050;Ts=1/fs;R1=10;wp=2*pi*1000/fs;ws=2*pi*1200/fs;Rp=1;Rl=100;wp1=2/Ts*tan(wp/2); %將模擬指標轉換成數字指標ws1=2/Ts*tan(ws/2); [N,Wn]=buttord(wp1,ws1,Rp,R1,'s'); %選擇濾波器的最小階數[Z,P,K]=buttap(N); %創建butterworth模擬濾波器[Bap,Aap]=zp2tf(Z,P,K);[b,a]=lp2lp(Bap,Aap,Wn); [bz,az]=bilinear(b,a,fs); %用雙線性變換法實現模擬濾波器到數字濾波器的轉換[H,W]=freqz(bz,az); figure(31)plot(W*fs/(2*pi),abs(H))gridxlabel('頻率/Hz');ylabel('頻率響應幅度');title('IIR低通濾波器');f1=filter(bz,az,y);figure(32)subplot(2,1,1) %畫出濾波前的時域圖plot(y); xlabel('時間(ms)'); ylabel('幅值'); title('IIR低通濾波器濾波前的時域波形');subplot(2,1,2)plot(f1); %畫出濾波后的時域圖title('IIR低通濾波器濾波后的時域波形');xlabel('時間(ms)'); ylabel('幅值');sound(f1,9000); %播放濾波后的信號F0=fft(f1,3000);f=fs*(0:511)/1024;figure(33)y2=fft(y,1024);subplot(2,1,1);plot(f,abs(y2(1:512))); %畫出濾波前的頻譜圖title('IIR低通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)f=fs*(0:511)/1024;F1=plot(f,abs(F0(1:512))); %畫出濾波后的頻譜圖title('IIR低通濾波器濾波后的頻譜')xlabel('頻率/Hz');ylabel('幅值');elseif temp==2%IIR高通濾波器fs=22050;Fs=22050;Ts=1/Fs;R1=50;Wp=2*pi*5000/fs;Ws=2*pi*3000/fs;Rp=1;Rl=100;Wp1=2/Ts*tan(Wp/2); %將模擬指標轉換成數字指標Ws1=2/Ts*tan(Ws/2); [N,Wn]=cheb2ord(Wp1,Ws1,Rp,Rl,'s'); %選擇濾波器的最小階數[Z,P,K]=cheb2ap(N,Rl); %創建切比雪夫模擬濾波器[Bap,Aap]=zp2tf(Z,P,K);[b,a]=lp2hp(Bap,Aap,Wn); [bz,az]=bilinear(b,a,Fs); %用雙線性變換法實現模擬濾波器到數字濾波器的轉換[H,W]=freqz(bz,az); %繪制頻率響應曲線figure(34)plot(W*fs/(2*pi),abs(H));gridxlabel('頻率/Hz');ylabel('頻率響應幅度');title('IIR高通濾波器');f1=filter(bz,az,y);figure(35)subplot(2,1,1)plot(y); %畫出濾波前的時域圖xlabel('時間(ms)'); ylabel('幅值'); title('IIR高通濾波器濾波前的時域波形');subplot(2,1,2)xlabel('時間(ms)'); ylabel('幅值'); plot(f1);xlabel('時間(ms)'); ylabel('幅值'); title('IIR高通濾波器濾波后的時域波形');sound(f1,8000); %播放濾波后的信號F0=fft(f1,1024);figure(36)y2=fft(y,1024);subplot(2,1,1);plot(f,abs(y2(1:512))); %畫出濾波前的頻譜圖title('IIR高通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)f=fs*(0:511)/1024;plot(f,abs(F0(1:512))); %畫出濾波后的頻譜圖title('IIR高通濾波器濾波后的頻譜')xlabel('頻率/Hz');ylabel('幅值');elseif temp==3%IIR帶通濾波器Fs=22050;Ts=1/Fs;R1=30;fb1=1200;fb2=3000;fc1=1000;fc2=3200;fs=22050;W1=2*fb1*pi/fs;W2=2*fc1*pi/fs;W3=2*fb2*pi/fs;W4=2*fc2*pi/fs;Wp=[W1,W3];Ws=[W2,W4];Rp=1;Rl=100;Wp1=2/Ts*tan(Wp/2); %將模擬指標轉換成數字指標Ws1=2/Ts*tan(Ws/2); [N,Wn]=cheb2ord(Wp1,Ws1,Rp,R1,'s'); %選擇濾波器的最小階數[Z,P,K]=cheb2ap(N,Rl); %創建切比雪夫模擬濾波器[Bap,Aap]=zp2tf(Z,P,K);[b,a]=lp2bp(Bap,Aap,2100*2*pi,1800*2*pi); [bz,az]=bilinear(b,a,Fs); %用雙線性變換法實現模擬濾波器到數字濾波器的轉換[H,W]=freqz(bz,az); %繪制頻率響應曲線figure(37)plot(W*fs/(2*pi),abs(H));gridxlabel('頻率/Hz');ylabel('頻率響應幅度');title('IIR帶通濾波器');f1=filter(bz,az,y);figure(38)subplot(2,1,1)plot(y); %畫出濾波前的時域圖xlabel('時間(ms)'); ylabel('幅值'); title('IIR帶通濾波器濾波前的時域波形');subplot(2,1,2)F0=fft(f1,1024);f=fs*(0:511)/1024;plot(f1);title('IIR帶通濾波器濾波后的時域波形');xlabel('時間(ms)'); ylabel('幅值'); sound(f1,8000); %播放濾波后的信號F0=fft(f1,3000);figure(39)y2=fft(y,1024);f=fs*(0:511)/1024;subplot(2,1,1);plot(f,abs(y2(1:512))); %畫出濾波前的頻譜圖title('IIR帶通濾波器濾波前的頻譜')xlabel('頻率/Hz');ylabel('幅值');subplot(2,1,2)plot(f,abs(F0(1:512))); %畫出濾波后的頻譜圖title('IIR帶通濾波器濾波后的頻譜')xlabel('頻率/Hz');ylabel('幅值');else endend
b=menu('請選擇選項','原始信號采樣后時域圖和頻譜圖','FIR濾波器','IIR濾波器','退出');
end
?
總結
以上是生活随笔為你收集整理的Matlab语音信号频谱分析代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谱减法降噪的matlab代码实现
- 下一篇: 测度论与概率论有什么关系?为什么要学习测