基于matlab对音频信号的频谱分析(幅频)和滤波分析
频谱分析
函数Spectrum.m
功能是生成单边频谱图和双边频谱图。
记得使用函数前要加
figure;% 建立窗口放频谱
以下是函数代码:
function Spectrum(y,t,fs)
%y为输入信号
%fs为采样频率
L = length(y); %信号长度
Xf = fftshift(abs(fft(y)));
%快速傅里叶变换,fftshift为去除采样卷积引起的fs/2处重叠。
subplot(3,1,1);%建立空图形
plot(t,y);%输出原波形
title('波形图');
xlabel('时间');
ylabel('幅值');
f = [0:L/2]*fs/L;%横坐标范围[0:fs/2]
subplot(3,1,2);
plot(f,Xf(round(L/2):L)*2);%输出单边频谱,取一半乘2。
title('单边幅频');
xlabel('f/Hz');
ylabel('An');
grid on;%背景网格
f = [-L/2:L/2-1]*fs/L;%横坐标范围[-fs/2:fs/2]
subplot(3,1,3);
plot(f,Xf);%输出双边频谱图
title('双边幅频');
xlabel('f/Hz');
ylabel('|X(f)|');
grid on;
end
滤波分析
低通、带通、高通滤波器
记得使用滤波器前要加
figure;% 建立窗口放频谱
以下是函数代码:
低通滤波器
function Lfilter(y,fs,ft)
%y为输入信号
%fs为采样频率
%ft为通带截至频率
L = length(y);
f = [-L/2:L/2-1]*fs/L;
Wn = ft/(0.5*fs);
[b,a] = butter(50,Wn,'low');%计算滤波器系数
Xt = filter(b,a,y);%滤波
subplot(3,1,1);%建立空图形
plot(f,fftshift(abs(fft(Xt))));
title('信号低通滤波后幅频');
xlabel('f/Hz');
ylabel('|X(f)|');
grid on;
%sound(Xt,fs);%播放滤波后音频
audiowrite('低通滤波后声音.wav',Xt,fs,'BitsPerSample',24);%存储滤波后wav音频文件
end
带通滤波器
function Bfilter(y,fs,f1,f2)
%y为输入信号
%fs为采样频率
%ft为通带截至频率
%f1为带通下限频率
%f2为带通上限频率
L = length(y);
f = [-L/2:L/2-1]*fs/L;
Wn1 = f1/(0.5*fs);
Wn2 = f2/(0.5*fs);
[b,a] = butter(50,[Wn1 Wn2]);%计算滤波器系数
Xt = filter(b,a,y);%滤波
subplot(3,1,2);%建立空图形
plot(f,fftshift(abs(fft(Xt))));
title('信号带通滤波后幅频');
xlabel('f/Hz');
ylabel('|X(f)|');
grid on;
%sound(Xt,fs);%播放滤波后音频
audiowrite('带通滤波后声音.wav',Xt,fs,'BitsPerSample',24);%存储滤波后wav音频文件
end
高通滤波器
function Hfilter(y,fs,ft)
%y为输入信号
%fs为采样频率
%ft为通带截至频率
L = length(y);
f = [-L/2:L/2-1]*fs/L;
Wn = ft/(0.5*fs);
[b,a] = butter(50,Wn,'high');%计算滤波器系数
Xt = filter(b,a,y);%滤波
subplot(3,1,3);%建立空图形
plot(f,fftshift(abs(fft(Xt))));
title('信号高通滤波后幅频');
xlabel('f/Hz');
ylabel('|X(f)|');
grid on;
%sound(Xt,fs);%播放滤波后音频
audiowrite('高通滤波后声音.wav',Xt,fs,'BitsPerSample',24);%存储滤波后wav音频文件
end
使用测试代码
[y,fs]=audioread('C:\Users\123\Desktop\声音\交响乐.wav');
y = y(:,1);%取单声道,直接用双声道图像会重叠。
T = 1/fs;
t=(0:length(y)-1)*T;%计算时长
figure;% 建立窗口放频谱
Spectrum(y,t,fs);%频谱分析
figure;% 建立窗口放滤波频谱
ft1=1000;%低通上限截至频率
Lfilter(y,fs,ft1);%低通滤波
f1=1000;%带通下限
f2=2000;%带通上限
Bfilter(y,fs,f1,f2);%带通滤波
ft2=2000;%高通下限截至频率
Hfilter(y,fs,ft2);%高通滤波