设计FIR滤波器(窗函数滤波器,考虑通带,阻带,纹波大小,过渡带宽度),分别滤出“熊” 和“鸟”的声音(两者清晰可辨,无明显混叠) 8. 分别画出滤波之后的“熊”和“鸟”的时域波形和fft频谱,通过sound函数分别播放,并与之前 的mix.wav音频和频谱对比 9. “熊”和“鸟”的时域波形分别存成bear.wav和bird.wav文件具体代码
时间: 2024-02-06 18:09:10 浏览: 32
由于题目没有给出具体的通带、阻带、纹波大小和过渡带宽度的要求,因此我们在这里以一个简单的例子来展示如何设计一个FIR滤波器。
假设我们需要设计一个低通滤波器,截止频率为1 kHz,通带最大衰减为1 dB,阻带最小衰减为40 dB,过渡带宽为100 Hz。我们可以采用窗函数法进行设计,具体步骤如下:
1. 确定滤波器的长度N,通常选择N为奇数。根据经验公式可以得到,N=4*fs/Δf+1,其中fs是采样频率,Δf是过渡带宽度。在本例中,假设采样频率为8 kHz,则N=401。
2. 计算理想的滤波器系数hd(n),可以使用Matlab的fir1函数进行计算。代码如下:
```matlab
N = 401;
fc = 1000;
fs = 8000;
Wp = 2*fc/fs;
b = fir1(N-1, Wp, 'low', kaiser(N, 4));
```
其中,N为滤波器长度,fc为截止频率,fs为采样频率,Wp为归一化的截止频率,b为滤波器系数。这里使用了kaiser窗函数,4为窗口的形状参数。
3. 对滤波器系数进行窗函数调整,可以使用Matlab的窗函数进行计算。代码如下:
```matlab
w = kaiser(N, 4);
h = b .* w';
```
其中,w为窗函数,h为最终的滤波器系数。
4. 对音频信号进行滤波,可以使用Matlab的filter函数进行计算。代码如下:
```matlab
[x, fs] = audioread('mix.wav');
y_bear = filter(h, 1, x(:, 1));
y_bird = filter(h, 1, x(:, 2));
```
其中,x为原始音频信号,y_bear和y_bird为滤波后的音频信号。
5. 绘制滤波后的时域波形和FFT频谱,可以使用Matlab的plot和fft函数进行计算。代码如下:
```matlab
% 绘制“熊”滤波后的时域波形和频谱
t = (0:length(y_bear)-1)/fs;
figure();
subplot(2,1,1);
plot(t, y_bear);
xlabel('Time (s)');
ylabel('Amplitude');
title('Filtered bear sound');
subplot(2,1,2);
Y_bear = abs(fft(y_bear));
f = (0:length(Y_bear)-1)*fs/length(Y_bear);
plot(f, Y_bear);
xlim([0, fs/2]);
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT of filtered bear sound');
% 绘制“鸟”滤波后的时域波形和频谱
t = (0:length(y_bird)-1)/fs;
figure();
subplot(2,1,1);
plot(t, y_bird);
xlabel('Time (s)');
ylabel('Amplitude');
title('Filtered bird sound');
subplot(2,1,2);
Y_bird = abs(fft(y_bird));
f = (0:length(Y_bird)-1)*fs/length(Y_bird);
plot(f, Y_bird);
xlim([0, fs/2]);
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('FFT of filtered bird sound');
```
6. 播放滤波后的音频信号,可以使用Matlab的sound函数进行播放。代码如下:
```matlab
sound(y_bear, fs);
sound(y_bird, fs);
```
7. 将滤波后的时域波形存储成wav文件,可以使用Matlab的audiowrite函数进行存储。代码如下:
```matlab
audiowrite('bear.wav', y_bear, fs);
audiowrite('bird.wav', y_bird, fs);
```
需要注意的是,由于本例中只是一个简单的示例,实际应用中需要根据具体的要求进行参数的调整。