MATLAB代码实现设计FIR滤波器(窗函数滤波器,考虑通带,阻带,纹波大小,过渡带宽度),分别滤出“熊” 和“鸟”的声音(两者清晰可辨,无明显混叠) , 分别画出滤波之后的“熊”和“鸟”的时域波形和fft频谱,通过sound函数分别播放,并与之前的mix.wav音频和频谱对比 ,“熊”和“鸟”的时域波形分别存成bear.wav和bird.wav文件
时间: 2023-11-25 07:05:19 浏览: 129
以下是MATLAB代码实现:
```matlab
% 设计FIR滤波器
fs = 44100; % 采样率
fc1 = 1500; % 通带截止频率
fc2 = 3000; % 阻带截止频率
f1 = fc1 / (fs/2); % 归一化通带截止频率
f2 = fc2 / (fs/2); % 归一化阻带截止频率
Rp = 1; % 通带最大纹波
Rs = 60; % 阻带最小衰减
deltaf = 500; % 过渡带宽度
L = ceil((Rs - 8) / (2.285 * deltaf / fs)); % 滤波器阶数
win = hamming(L+1)'; % 使用汉明窗口
b = fir1(L, [f1, f2], win); % FIR滤波器系数
% 读取音频文件
mix = audioread('mix.wav');
t = (0:length(mix)-1)/fs;
% 进行滤波
bear = filter(b, 1, mix(:,1));
bird = filter(b, 1, mix(:,2));
% 绘制时域波形和频谱
figure;
subplot(2,2,1);
plot(t, bear);
title('Bear - Time Domain');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,2);
plot(t, bird);
title('Bird - Time Domain');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,3);
plot(linspace(-fs/2, fs/2, length(mix)), fftshift(abs(fft(mix(:,1)))), 'b');
hold on;
plot(linspace(-fs/2, fs/2, length(bear)), fftshift(abs(fft(bear))), 'r');
title('Bear - Frequency Domain');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
legend('Before Filtering', 'After Filtering');
subplot(2,2,4);
plot(linspace(-fs/2, fs/2, length(mix)), fftshift(abs(fft(mix(:,2)))), 'b');
hold on;
plot(linspace(-fs/2, fs/2, length(bird)), fftshift(abs(fft(bird))), 'r');
title('Bird - Frequency Domain');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
legend('Before Filtering', 'After Filtering');
% 播放音频并保存文件
sound(mix, fs);
pause(length(mix)/fs);
audiowrite('bear.wav', bear, fs);
sound(bear, fs);
pause(length(bear)/fs);
audiowrite('bird.wav', bird, fs);
sound(bird, fs);
```
其中,我们使用了`fir1`函数来设计FIR滤波器,使用了汉明窗口。然后读取音频文件,对两个声道分别进行滤波,绘制时域波形和频谱,并使用`sound`函数播放音频并保存文件。
需要注意的是,为了让“熊”和“鸟”的声音清晰可辨,我们需要根据实际情况调整通带和阻带的截止频率、纹波大小和阻带最小衰减等参数,以及选择合适的过渡带宽度和窗口函数。
阅读全文