笔记十是音频信号处理,首先加载音频信号,分析其时频域,然后加入单频噪声干扰,最后选择滤波器进行滤波处理。
一、音频信号时频域分析
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;
带阻文章来源:https://www.toymoban.com/news/detail-488632.html
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. 结果展示
文章来源地址https://www.toymoban.com/news/detail-488632.html
到了这里,关于MATLAB GUI笔记(十):音频信号处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!