应用 Matlab 对语音信号进行频谱分析及滤波------代码

for i=1:3
    b=menu('请选择:','原始信号采样后的时域图和频谱图','FIR滤波器','IIR滤波器','退出');
    if b==1
        for j=1:3
            temp=menu('请选择','播放原始语音','原始语音时域图和频谱图','FFT频谱图');
            if temp==1
                clc;
                clear;
                [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                sound(x,fs); %播放语音信号
                %main(1)
            else
                if temp==2
                    [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                    sound(x,fs); %播放语音信号
                    N=length(x); %长度
                    n=0:N-1;
                    w=2*n*pi/N;
                    y1=fft(x); %对原始信号做FT变换
                    subplot(2,1,1);
                    plot(n,x) %做原始语音信号的时域波形图
                    title('原始语音信号时域图');
                    xlabel('时间t');
                    ylabel('幅值');
                    
                    subplot(2,1,2); %做原始语音信号的频谱图
                    plot(w/pi,abs(y1));
                    title('原始语音信号频谱')
                    xlabel('频率Hz');
                    ylabel('幅度');
                    %main(1);
                else
                    
                    [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号sound(x,fs); %播放语音信号
                    N=length(x); %长度
                    n=0:N-1;
                    w=2*n*pi/N;
                    y1=fft(x); %对原始信号做FFT变换
                    subplot(2,1,1); %做原始语音信号的频谱图
                    plot(w/pi,abs(y1));
                    title('原始语音信号频谱')
                    xlabel('频率Hz');
                    ylabel('幅度');
                    df=fs/(N-1); %分辨率
                    f=(0:N-1)*df; %其中每点的频率
                    Y=fft(x(1:N))/N*2; %真实的幅值 %
                    Y=fftshift(Y);
                    subplot(2,1,2); %做原始语音信号的频谱图
                    plot(f(1:N/2),abs(Y(1:N/2)));
                    title('原始语音信号采样后的FFT频谱')
                    xlabel('频率Hz');
                    ylabel('幅值');
                    
                end
            end
        end
    else
        if b==2
            for k=1:3
                temp1=menu('请选择','FIR低通滤波器','FIR高通滤波器','FIR带通滤波器');
                if temp1==1
                    %FIR低通
                    [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                    sound(x,fs);  %播放滤波后的语音信号
                    
                    wp=2*pi*1000/fs;
                    ws=2*pi*1200/fs;
                    Rp=1;
                    Rs=53;
                    wdelta=ws-wp;
                    N=ceil(8* pi/wdelta);  %取整
                    wn=(wp+ws)/2;
                    [b,a]=fir1(N,wn/pi,hamming(N+1));  %选择窗函数,并归一化截止频率
                    
                    figure(1)
                    freqz(b,a,512);
                    title('FIR低通滤波器');
                    f2=filter(b,a,x);
                    
                    figure(2)
                    subplot(2,2,1)
                    plot(x)
                    title('FIR低通滤波器滤波前的时域波形');
                    
                    subplot(2,2,2)
                    plot(f2);
                    title('FIR低通滤波器滤波后的时域波形');
                    pause(2);
                    sound(f2,fs);  %播放滤波后的语音信号
                    
                    F0=fft(f2,1024);
                    f=fs*(0:511)/1024;
                    
                    y2=fft(x,1024);
                    subplot(2,2,3);
                    plot(f,abs(y2(1:512)));
                    title('FIR低通滤波器滤波前的频谱')
                    xlabel('频率/Hz');
                    ylabel('幅值');
                    
                    subplot(2,2,4)
                    F2=plot(f,abs(F0(1:512)));
                    title('FIR低通滤波器滤波后的频谱')
                    xlabel('频率/Hz');
                    ylabel('幅值');
                    ylabel('幅值');xlabel('频率/Hz');
                    ylabel('幅值');
                    %main(2);
                else
                    if temp1==2
                        %FIR高通
                        [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                        sound(x,fs);
                        wp=2*pi*5000/fs;
                        ws=2*pi*3600/fs;
                        Rp=1;
                        Rs=53;
                        wdelta=wp-ws;
                        N=ceil(8*pi/wdelta);  %取整
                        wn=(wp+ws)/2;
                        [b,a]=fir1(N,wn/pi,'high');
                        
                        figure(1)
                        freqz(b,a,512);
                        title('FIR高通滤波器');
                        
                        f2=filter(b,a,x);
                        figure(2)
                        
                        subplot(2,2,1)
                        plot(x)
                        title('FIR高通滤波器滤波前的时域波形');
                        
                        subplot(2,2,2)
                        plot(f2);
                        title('FIR高通滤波器滤波后的时域波形');
                        pause(2);
                        sound(f2,fs);  %播放滤波后的语音信号
                        
                        F0=fft(f2,1024);
                        f=fs*(0:511)/1024;
                        
                        
                        y2=fft(x,1024);
                        subplot(2,2,3);
                        plot(f,abs(y2(1:512)));
                        title('FIR高通滤波器滤波前的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        
                        subplot(2,2,4)
                        F2=plot(f,abs(F0(1:512)));
                        title('FIR高通滤波器滤波后的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        % main(2);
                    else
                        
                        %FIR 带通
                        [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                        sound(x,fs);
                        wp1 =2*pi*1400/fs;wp2=2*pi*3400/fs;
                        ws1 =2*pi*1200/fs;ws2=2*pi*3400/fs;
                        Rp=1;
                        Rs=53;
                        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,'bandpas');
                        
                        figure(1)
                        freqz(b,a,512);
                        title('FIR带通滤波器');
                        
                        f2=filter(b,a,x);
                        figure(2)
                        
                        subplot(2,2,1)
                        plot(x)
                        title('FIR带通滤波器滤波前的时域波形');
                        
                        subplot(2,2,2)
                        plot(f2);
                        title('FIR带通滤波器滤波后的时域波形');
                        pause(2);
                        sound(f2,fs);  %播放滤波后的语音信号
                        
                        F0=fft(f2,1024);
                        f=fs*(0:511)/1024;
                        
                        y2=fft(x,1024);
                        
                        subplot(2,2,3);
                        plot(f,abs(y2(1:512)));
                        title('FIR带通滤波器滤波前的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        
                        subplot(2,2,4)
                        plot(f,abs(F0(1:512)));
                        title('FIR带通滤波器滤波后的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        %main(2)
                    end
                end
            end
        else
            for l=1:3
                temp2=menu('请选择','IIR低通滤波器','IIR高通滤波器','IIR带通滤波器');
                if temp2==1
                    %IIR低通
                    [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                    sound(x ,fs);
                    
                    Ts=1/fs;R1=100;
                    wp=2*pi*1000/fs;
                    ws=2*pi*1200/fs;
                    Rp=1;
                    Rl=8;
                    wp1=2/Ts*tan(wp/2);  %将模拟指标转换成数字指标
                    ws1=2/Ts*tan(ws/2);
                    [N,Wn]=buttord(wp1,ws1,Rp,Rl,'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(1)
                    plot(W*fs/(2* pi),abs(H))
                    grid
                    xlabel('频率/ Hz')
                    ylabel('频率响应幅度')
                    title('IIR低通滤波器')
                    
                    figure(2)
                    subplot(2,2,1)
                    plot(x)  %画出滤波前的时域图
                    title('IIR低通滤波器滤波前的时域波形');
                    
                    y1=filter(bz,az,x);
                    subplot(2,2,2)
                    plot(y1);  %画出滤波后的时域图
                    title('IIR低通滤波器滤波后的时域波形');
                    pause(2);
                    sound(y1 ,41000);  %播放滤波后的信号
                    
                    F0=fft(y1,1024);
                    f=fs*(0:511)/1024;
                    
                    y2=fft(x,1024);
                    subplot(2,2,3);
                    plot(f,abs(y2(1:512)));  %画出滤波前的频谱图
                    title('IIR低通滤波器滤波前的频谱')
                    xlabel('频率/Hz');
                    ylabel('幅值');
                    
                    subplot(2,2,4)
                    F1=plot(f,abs(F0(1:512))); %画{出滤波后的频谱图
                    title('lIR低通滤波器滤波后的频谱')
                    %main(3);
                else
                    if temp2==2
                        %IIR高通
                        [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                        sound(x,fs);
                        Ts=1/fs;R1=50;
                        Wp=2*pi*4400/fs;
                        Ws=2* pi*4000/fs;
                        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]=lp2hp(Bap,Aap,Wn);
                        [bz,az ]=bilinear(b,a,fs);  %用双线性变换法实现模拟滤波器到数字滤波器的转换
                        
                        [H,W]=freqz(bz,az);  %绘制频率响应曲线
                        figure(1)
                        plot(W*fs/(2*pi),abs(H))
                        grid
                        xlabel('频率/ Hz')
                        ylabel('频率响应幅度')
                        title('IIR高通滤波器')
                        
                        f1=filter(bz,az,x);
                        figure(2)
                        
                        subplot(2,2,1)
                        plot(x)  %画出滤波前的时域图
                        title('IIR高通滤波器滤波前的时域波形');
                        
                        subplot(2,2,2)
                        plot(f1);  %画出滤波后的时域图
                        title('IIR高通滤波器滤波后的时域波形');
                        pause(2);
                        sound(f1,44100);  %播放滤波后的信号
                        
                        F0=fft(f1,1024);
                        f=fs*(0:511)/1024;
                        
                        y2=fft(x,1024);
                        subplot(2,2,3)
                        plot(f,abs(y2(1:512)));  %画出滤波前的频谱图
                        title('IIR高通滤波器滤波前的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        
                        subplot(2,2,4);
                        plot(f,abs(F0(1:512)));  %画出滤波后的频谱图
                        title('IIR高通滤波器滤波后的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        %main(3);
                    else
                        %IIR带通
                        [x,fs]=audioread('D:\matlab\bin\张婷婷.wav'); %打开语音信号
                        sound(x,fs);
                        Ts= 1/fs;R1=30;
                        fb1=1200;fb2=3000;fc1=1000;fc2=3200;fs=23000;
                        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(1)
                        plot(W*fs/(2*pi),abs(H))
                        grid
                        xlabel('频率/ Hz')
                        ylabel('频率响应幅度')
                        title('IIR带通滤波器')
                        
                        f1 =filter(bz,az,x);
                        figure(2)
                        subplot(2,2,1)
                        plot(x)   %画出滤波前的时域图
                        title('IIR带通滤波器滤波前的时域波形');
                        
                        subplot(2,2,2)
                        plot(f1);   %画出滤波后的时域图
                        title('IIR带通滤波器滤波后的时域波形');
                        fs2=50000;
                        pause(2);
                        sound(f1 ,fs2);  %播放滤波后的信号
                        
                        F0=fft(f1,1024);
                        f=fs*(0:511)/1024;
                        
                        y2=fft(x,1024);
                        subplot(2,2,3);
                        plot(f,abs(y2(1:512))); %画出滤波前的频谱图
                        title('IIR带通滤波器滤波前的频谱')
                        xlabel('频率/Hz');
                        ylabel('幅值');
                        
                        subplot(2,2,4)
                        plot(f,abs(F0(1:512)));  %画出滤波后的频谱图
                        title('IIR带通滤波器滤波后的频谱')
                        xlabel('频率/Hz');
                        xlabel('频率/Hz');
                        % main(3);
                    end
                end
            end
        end
    end
end

你可能感兴趣的:(matlab之信号处理)