MATLAB GUI笔记(十):音频信号处理

10 篇文章 8 订阅

笔记十是音频信号处理,首先加载音频信号,分析其时频域,然后加入单频噪声干扰,最后选择滤波器进行滤波处理。

一、音频信号时频域分析

1. 打开GUI

选择Blank GUI,然后更改保存路径
在这里插入图片描述

2. 点击1个面板和2个坐标区,然后拖动出来

在这里插入图片描述

3. 双击面板查看它的属性

改变字体大小和显示内容
在这里插入图片描述

4. 再拖动一个按钮

在这里插入图片描述

5. 双击按钮查看它的属性

更改字体大小和显示内容
在这里插入图片描述

6. 右键打开文件按钮,选择查看回调,点击callback

在这里插入图片描述
注意:以下代码中的部分变量使用global,是全局变量,这样别的控件callback函数也能调用该变量。

global x;                                 % 信号的时域
global Fs;                                % 信号的采样频率
global tl;                                % 信号的时域坐标范围
global x2;                                % 信号的时域
% 获取文件的路径和名称,注意文件格式为.wav格式
[filename, pathname] = uigetfile('*.wav', '音频信号路径');
% 如果没有选择文件,则返回0,显示未选择文件
if isequal(filename,0)
   disp('未选择文件')
else
% 如果选择了文件,保存文件的路径
   path = fullfile(pathname, filename);   % 将文件的所处文件夹路径和文件名拼接成文件路径
   [handles.x,handles.Fs]=audioread(path);% 将文件读取出来,输出信号的时域和采样频率并保存在handle中
   x=handles.x;                           % 信号的时域
   Fs=handles.Fs;                         % 信号的采样频率
   axes(handles.axes1);                   % 将当前绘图区设置为axes1
   tl=[0:1/Fs:(length(handles.x)-1)/Fs];  % 信号时域波形的坐标范围,间隔为采样频率的倒数
   plot(tl,handles.x);                    % 绘制信号时域波形
   axis([-inf inf -1.2 1.2]);             % 坐标轴的范围
   title('音频信号时域波形');             % 标题
   xlabel('时间/s');                      % 横坐标标签
   ylabel('幅度');                        % 纵坐标标签
   grid on;                               % 网格线打开
   
   N=length(handles.x);                   % 信号的长度
   df=Fs/N;                               % 频谱分辨率
   w=[0:df:df*(N-1)] - Fs/2;              % 频谱范围,-fs/2至fs/2
   X=fft(handles.x);                      % 对信号做FFT
   X=fftshift(X);                         % 将FFT之后的频谱中心化,将0-fs频谱转换成-fs/2至fs/2频谱
   axes(handles.axes2);                   % 设置当前坐标区为axes2
   plot(w,abs(X)/max(abs(X)));            % 绘制信号频谱
   axis([-10000,10000,0,1]);              % 坐标轴范围
   title('音频信号频域波形');             % 标题
   xlabel('频率/Hz');                     % 横坐标标签
   ylabel('归一化幅度');                  % 纵坐标标签
   grid on;                               % 打开网格线
   x2=x;
end

7. 原始信号展示

在这里插入图片描述
在这里插入图片描述

二、播放音频和关闭音频

8. 拖动两个按钮

在这里插入图片描述

9. 双击按钮查看它的属性

可以更改字体大小和显示内容
在这里插入图片描述
在这里插入图片描述

10. 右键播放音频按钮,选择查看回调,点击callback

在这里插入图片描述

global x2;                      % 音频信号
global Fs;                      % 信号的采样频率
sound(x2,Fs);                   % 播放音频

11. 右键关闭音频按钮,选择查看回调,点击callback

在这里插入图片描述

clear sound;                    % 关闭音频

三、加入单频干扰后的视频域分析

在这里插入图片描述

13. 双击按钮和可编辑文本

查看属性并更改字体大小和显示内容
在这里插入图片描述
在这里插入图片描述

14. 右键加入单频噪声干扰按钮,查看回调,点击callback

在这里插入图片描述

global x;                               % 信号时域波形
global Fs;                              % 信号采样频率
global tl;                              % 信号时域范围
global x2;                              % 信号时域波形
axes(handles.axes1);                    % 将当前坐标区设置为axes1
t=0:1/Fs:(length(x)-1)/Fs;              % 单频干扰信号的时域范围      
Au=0.07;                                % 单频干扰信号幅度
fn =  get(handles.edit1,'string');      % 获取输入的单频干扰频率值 
fn = str2double(fn);                    % 将string转换成double型
noise=Au*cos(2*pi*fn*t)';               % 单频干扰信号的波形,加转置是因为音频信号x是列向量,需要统一
x=x+noise;                              % 将音频信号和单频干扰相加
plot(tl,x);                             % 绘制加入噪声后音频信号时域波形
title('加入噪声后时域波形');            % 标题
xlabel('时间/s');                       % 横轴标签
ylabel('幅度');                         % 纵轴标签
grid on;                                % 打开网格线
N=length(x);                            % 信号长度
df=Fs/N;                                % 信号频谱分辨率
w=[0:df:df*(N-1)] - Fs/2;               % 信号频率范围
X=fft(x);                               % 对信号做FFT
X=fftshift(X);                          % 将0-fs频谱搬移到-fs/2-fs/2
axes(handles.axes2);                    % 将当前坐标区设置为axes2
plot(w,abs(X)/max(abs(X)));             % 绘制信号频谱
axis([-10000,10000,0,1]);               % 坐标轴范围
title('加入噪声后频域波形');            % 标题
xlabel('频率/Hz');                      % 横轴标签
ylabel('幅度');                         % 纵轴标签
grid on;                                % 打开网格线
x2=x;

15. 单频干扰信号展示

在这里插入图片描述

四、滤波后信号时频域分析

16. 拖动3个坐标区、1个面板、4个单选按钮、4个按钮、2个静态文本和2个可编辑文本

在这里插入图片描述

17 双击它们,更改字体大小和显示内容以及标签

面板
在这里插入图片描述
单选按钮
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按钮
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
静态文本
在这里插入图片描述
在这里插入图片描述
可编辑文本
在这里插入图片描述
在这里插入图片描述

18. 右键低通按钮,查看回调函数,点击callback

在这里插入图片描述

global x;                           % 音频信号
global Fs;                          % 采样频率
global tl;                          % 音频信号时域范围
global x2;                          % 音频信号

x1=x;
fp =  get(handles.edit2,'string');  % 截止频率1   
fp =  str2double(fp)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
if get(handles.radiobutton1,'value')% 如果选中了第一个单选按钮,矩形窗按钮
    b2=fir1(30, fp/Fs, boxcar(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的矩形窗滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton2,'value')% 如果选中了第二个单选按钮,三角窗按钮
    b2=fir1(30, fp/Fs, triang(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的三角窗滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton3,'value')% 如果选中了第三个单选按钮,汉明窗按钮
    b2=fir1(30, fp/Fs, hamming(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的汉明窗滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton4,'value')% 如果选中了第四个单选按钮,凯撒窗按钮
    b2=fir1(30,fp/Fs, kaiser(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的凯撒窗滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
end;
axes(handles.axes4);                % 设置当前坐标区为axes4
plot(tl,x1);                        % 绘制滤波后的时域波形
title('滤波后时域波形');            % 标题
xlabel('时间/s');                   % 横轴标签
ylabel('幅度');                     % 纵轴坐标
axis([-inf,inf,-1.2,1.2]);          % 坐标轴范围
N=length(x1);                       % 时域波形长度
df=Fs/N;                            % 滤波后信号的频谱分辨率
w=[0:df:df*(N-1)] - Fs/2;           % 频率范围
X=fft(x1);                          % 对滤波后的信号做FFT
X=fftshift(X);                      % 将0-fs频谱,转换到-fs/2-fs/2频谱
axes(handles.axes5);                % 设置当前坐标区为axes4
plot(w,abs(X)/max(abs(X)));         % 绘制频谱
axis([-10000,10000,0,1]);           % 坐标轴范围
title('滤波后频谱');                % 标题
xlabel('频率/Hz');                  % 横轴标签
ylabel('幅度');                     % 纵轴坐标
grid on;                            % 打开网格线
x2=x1;

19. 同样,更改高通,带通和带阻的callback函数

高通

global x;                           % 音频信号
global Fs;                          % 采样频率
global tl;                          % 音频信号时域范围
global x2;                          % 音频信号

x1=x;
fp =  get(handles.edit2,'string');  % 截止频率1   
fp =  str2double(fp)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
if get(handles.radiobutton1,'value')% 如果选中了第一个单选按钮,矩形窗按钮
    b2=fir1(30, fp/Fs,'high',boxcar(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数四个参数分别是阶数、数字截止频率、类型、滤波器类型
    % 这里是生成了30阶(31个抽头系数)的矩形窗高通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton2,'value')% 如果选中了第二个单选按钮,三角窗按钮
    b2=fir1(30, fp/Fs, 'high',triang(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数四个参数分别是阶数、数字截止频率、类型、滤波器类型
    % 这里是生成了30阶(31个抽头系数)的三角窗高通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton3,'value')% 如果选中了第三个单选按钮,汉明窗按钮
    b2=fir1(30, fp/Fs,'high',hamming(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数四个参数分别是阶数、数字截止频率、类型、滤波器类型
    % 这里是生成了30阶(31个抽头系数)的汉明窗高通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton4,'value')% 如果选中了第四个单选按钮,凯撒窗按钮
    b2=fir1(30,fp/Fs,'high',kaiser(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数四个参数分别是阶数、数字截止频率、类型、滤波器类型
    % 这里是生成了30阶(31个抽头系数)的凯撒窗高通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
end;
axes(handles.axes4);                % 设置当前坐标区为axes4
plot(tl,x1);                        % 绘制滤波后的时域波形
title('滤波后时域波形');            % 标题
xlabel('时间/s');                   % 横轴标签
ylabel('幅度');                     % 纵轴坐标
axis([-inf,inf,-1.2,1.2]);          % 坐标轴范围
N=length(x1);                       % 时域波形长度
df=Fs/N;                            % 滤波后信号的频谱分辨率
w=[0:df:df*(N-1)] - Fs/2;           % 频率范围
X=fft(x1);                          % 对滤波后的信号做FFT
X=fftshift(X);                      % 将0-fs频谱,转换到-fs/2-fs/2频谱
axes(handles.axes5);                % 设置当前坐标区为axes4
plot(w,abs(X)/max(abs(X)));         % 绘制频谱
axis([-10000,10000,0,1]);           % 坐标轴范围
title('滤波后频谱');                % 标题
xlabel('频率/Hz');                  % 横轴标签
ylabel('幅度');                     % 纵轴坐标
grid on;                            % 打开网格线
x2=x1;

带通

global x;                           % 音频信号
global Fs;                          % 采样频率
global tl;                          % 音频信号时域范围
global x2;                          % 音频信号

x1=x;
fp =  get(handles.edit2,'string');  % 截止频率1   
fp =  str2double(fp)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
fs =  get(handles.edit3,'string');  % 截止频率2   
fs =  str2double(fs)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
if get(handles.radiobutton1,'value')% 如果选中了第一个单选按钮,矩形窗按钮
    b2=fir1(30, [fp/Fs fs/Fs], boxcar(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的矩形窗带通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton2,'value')% 如果选中了第二个单选按钮,三角窗按钮
    b2=fir1(30, [fp/Fs fs/Fs], triang(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的三角窗带通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton3,'value')% 如果选中了第三个单选按钮,汉明窗按钮
    b2=fir1(30, [fp/Fs fs/Fs], hamming(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的汉明窗带通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton4,'value')% 如果选中了第四个单选按钮,凯撒窗按钮
    b2=fir1(30,[fp/Fs fs/Fs], kaiser(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的凯撒窗带通滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度');                 % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
end;
axes(handles.axes4);                % 设置当前坐标区为axes4
plot(tl,x1);                        % 绘制滤波后的时域波形
title('滤波后时域波形');            % 标题
xlabel('时间/s');                   % 横轴标签
ylabel('幅度');                     % 纵轴坐标
axis([-inf,inf,-1.2,1.2]);          % 坐标轴范围
N=length(x1);                       % 时域波形长度
df=Fs/N;                            % 滤波后信号的频谱分辨率
w=[0:df:df*(N-1)] - Fs/2;           % 频率范围
X=fft(x1);                          % 对滤波后的信号做FFT
X=fftshift(X);                      % 将0-fs频谱,转换到-fs/2-fs/2频谱
axes(handles.axes5);                % 设置当前坐标区为axes4
plot(w,abs(X)/max(abs(X)));         % 绘制频谱
axis([-10000,10000,0,1]);           % 坐标轴范围
title('滤波后频谱');                % 标题
xlabel('频率/Hz');                  % 横轴标签
ylabel('幅度');                     % 纵轴坐标
grid on;                            % 打开网格线
x2=x1;

带阻

global x;                           % 音频信号
global Fs;                          % 采样频率
global tl;                          % 音频信号时域范围
global x2;                          % 音频信号

x1=x;
fp =  get(handles.edit2,'string');  % 截止频率1   
fp =  str2double(fp)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
fs =  get(handles.edit3,'string');  % 截止频率2   
fs =  str2double(fs)*2;             % 将截止频率转换成double,然后乘以2,乘以2是为了归一化化成数字频率
if get(handles.radiobutton1,'value')% 如果选中了第一个单选按钮,矩形窗按钮
    b2=fir1(30, [fp/Fs fs/Fs],'stop', boxcar(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的矩形窗带阻滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度/dB');              % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton2,'value')% 如果选中了第二个单选按钮,三角窗按钮
    b2=fir1(30, [fp/Fs fs/Fs],'stop', triang(31)); % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的三角窗带阻滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度/dB');              % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton3,'value')% 如果选中了第三个单选按钮,汉明窗按钮
    b2=fir1(30, [fp/Fs fs/Fs],'stop', hamming(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的汉明窗带阻滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度/dB');              % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
    elseif get(handles.radiobutton4,'value')% 如果选中了第四个单选按钮,凯撒窗按钮
    b2=fir1(30,[fp/Fs fs/Fs],'stop', kaiser(31));  % 生成fir滤波器系统函数中分子多项式的系数
    % fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
    % 这里是生成了30阶(31个抽头系数)的凯撒窗带阻滤波器
    axes(handles.axes3);            % 设置当前坐标区为axes3
    [h,w]=freqz(b2, 1,512);         % 生成fir滤波器的频率响应
    % freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
    plot(w/pi*Fs/2,20*log(abs(h))); % 绘制滤波器的幅频响应
    xlabel('频率');                 % 横轴标签
    ylabel('幅度/dB');              % 纵轴标签
    title('滤波器频谱');            % 标题
    x1=fftfilt(b2,x1);              % 对信号进行滤波,x1是等待滤波的信号,b2是fir滤波器的系统函数的分子多项式系数
end;
axes(handles.axes4);                % 设置当前坐标区为axes4
plot(tl,x1);                        % 绘制滤波后的时域波形
title('滤波后时域波形');            % 标题
xlabel('时间/s');                   % 横轴标签
ylabel('幅度');                     % 纵轴坐标
axis([-inf,inf,-1.2,1.2]);          % 坐标轴范围
N=length(x1);                       % 时域波形长度
df=Fs/N;                            % 滤波后信号的频谱分辨率
w=[0:df:df*(N-1)] - Fs/2;           % 频率范围
X=fft(x1);                          % 对滤波后的信号做FFT
X=fftshift(X);                      % 将0-fs频谱,转换到-fs/2-fs/2频谱
axes(handles.axes5);                % 设置当前坐标区为axes4
plot(w,abs(X)/max(abs(X)));         % 绘制频谱
axis([-10000,10000,0,1]);           % 坐标轴范围
title('滤波后频谱');                % 标题
xlabel('频率/Hz');                  % 横轴标签
ylabel('归一化幅度');               % 纵轴坐标
grid on;                            % 打开网格线
x2=x1;

20. 结果展示

在这里插入图片描述

  • 16
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜yuan~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值