设计FIR滤波器(窗函数滤波器,考虑通带,阻带,纹波大小,过渡带宽度),分别滤出“熊” 和“鸟”的声音(两者清晰可辨,无明显混叠) 8. 分别画出滤波之后的“熊”和“鸟”的时域波形和fft频谱,通过sound函数分别播放,并与之前 的mix.wav音频和频谱对比 9. “熊”和“鸟”的时域波形分别存成bear.wav和bird.wav文件具体代码
时间: 2024-02-06 22:09:23 浏览: 67
用窗函数设计FIR滤波器111
由于题目没有给出具体的滤波器参数,我在这里就假设了一组参数,并给出相应的代码实现。
```python
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 读入音频文件
fs, data = wavfile.read('mix.wav')
# 设计滤波器
N = 101 # 滤波器阶数
fc1 = 500 # 通带截止频率
fc2 = 2000 # 阻带截止频率
delta1 = 0.05 # 最大通带纹波
delta2 = 0.01 # 最大阻带衰减
B = signal.firwin(N, [fc1, fc2], pass_zero=False, window='hamming', fs=fs)
A = 1
freq, response = signal.freqz(B, A, worN=4096)
# 绘制滤波器频率响应
fig, ax = plt.subplots(2, 1, figsize=(8, 6))
ax[0].plot(freq, 20*np.log10(abs(response)))
ax[0].set_ylabel('Magnitude (dB)')
ax[0].grid(True)
ax[1].plot(freq, np.unwrap(np.angle(response)))
ax[1].set_xlabel('Frequency (Hz)')
ax[1].set_ylabel('Phase (rad)')
ax[1].grid(True)
plt.show()
# 滤波
data_bear = signal.lfilter(B, A, data[:, 0])
data_bird = signal.lfilter(B, A, data[:, 1])
# 绘制时域波形
fig, ax = plt.subplots(2, 1, figsize=(8, 6))
t = np.arange(len(data))/fs
ax[0].plot(t, data_bear)
ax[0].set_xlabel('Time (s)')
ax[0].set_ylabel('Amplitude')
ax[0].set_title('Bear')
ax[0].grid(True)
ax[1].plot(t, data_bird)
ax[1].set_xlabel('Time (s)')
ax[1].set_ylabel('Amplitude')
ax[1].set_title('Bird')
ax[1].grid(True)
plt.show()
# 绘制频域波形
fig, ax = plt.subplots(2, 1, figsize=(8, 6))
freq, spec_bear = signal.welch(data_bear, fs, nperseg=1024, window='hamming', nfft=4096)
freq, spec_bird = signal.welch(data_bird, fs, nperseg=1024, window='hamming', nfft=4096)
ax[0].semilogy(freq, spec_bear)
ax[0].set_xlabel('Frequency (Hz)')
ax[0].set_ylabel('Magnitude')
ax[0].set_title('Bear')
ax[0].grid(True)
ax[1].semilogy(freq, spec_bird)
ax[1].set_xlabel('Frequency (Hz)')
ax[1].set_ylabel('Magnitude')
ax[1].set_title('Bird')
ax[1].grid(True)
plt.show()
# 保存滤波之后的音频文件
wavfile.write('bear.wav', fs, data_bear.astype(np.int16))
wavfile.write('bird.wav', fs, data_bird.astype(np.int16))
```
根据上面的代码,我们可以得到滤波之后的时域波形和频域波形,并将它们与原始的混合音频进行比较。需要注意的是,由于音频文件可能存在浮点数和整数的混合编码,因此在保存滤波之后的音频文件时需要将数据类型转换为整型。
另外,如果要播放音频文件,可以使用 `sounddevice` 库或者 `pydub` 库进行播放,具体可以参考它们的文档。
阅读全文