12. 利用限幅平均滤波法,对语音信号文件加高斯噪声后进行滤波画出采样后语音信号的时域波形和频谱图;给定滤波器的性能指标,设计滤波器,然后用设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化,回放语音信号。
时间: 2024-05-06 12:17:52 浏览: 101
对语音信号文件加高斯噪声后,我们可以先使用限幅平均滤波法进行滤波,以减小噪声的影响。具体步骤如下:
1. 读入语音信号文件,并加上高斯噪声。这里我们可以使用Python中的SciPy库进行实现:
```python
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
# 读入语音信号文件
fs, speech = wavfile.read('speech.wav')
# 加上高斯噪声
noise = np.random.normal(0, 0.1, len(speech))
noisy_speech = speech + noise
```
2. 实现限幅平均滤波法,这里我们可以设置一个阈值,当信号的幅值超过该阈值时,将其平均值作为滤波后的值,否则保持原值不变。
```python
# 限幅平均滤波法
def limit_average_filter(signal, threshold):
filtered_signal = np.zeros_like(signal)
for i in range(len(signal)):
if abs(signal[i]) > threshold:
filtered_signal[i] = np.mean(signal[i-50:i+50])
else:
filtered_signal[i] = signal[i]
return filtered_signal
# 对加噪声的语音信号进行限幅平均滤波
filtered_speech = limit_average_filter(noisy_speech, 0.2)
```
3. 绘制采样后语音信号的时域波形和频谱图。
```python
# 绘制时域波形图
plt.figure()
plt.plot(speech, label='Original Speech')
plt.plot(noisy_speech, label='Noisy Speech')
plt.plot(filtered_speech, label='Filtered Speech')
plt.legend()
plt.xlabel('Sample')
plt.ylabel('Amplitude')
plt.title('Speech Signals')
# 绘制频谱图
plt.figure()
plt.magnitude_spectrum(speech, Fs=fs, color='b', alpha=0.7, label='Original Speech')
plt.magnitude_spectrum(noisy_speech, Fs=fs, color='r', alpha=0.7, label='Noisy Speech')
plt.magnitude_spectrum(filtered_speech, Fs=fs, color='g', alpha=0.7, label='Filtered Speech')
plt.legend()
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('Speech Frequency Spectrum')
```
4. 设计滤波器,并使用设计的滤波器对采集的信号进行滤波。这里我们可以使用Butterworth低通滤波器,将截止频率设置为4kHz。
```python
from scipy.signal import butter, lfilter
# 设计Butterworth低通滤波器
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# 对采集的信号进行滤波
cutoff = 4000
b, a = butter_lowpass(cutoff, fs, order=5)
filtered_signal = lfilter(b, a, speech)
```
5. 绘制滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化。
```python
# 绘制时域波形图
plt.figure()
plt.plot(speech, label='Original Speech')
plt.plot(filtered_signal, label='Filtered Speech')
plt.legend()
plt.xlabel('Sample')
plt.ylabel('Amplitude')
plt.title('Speech Signals')
# 绘制频谱图
plt.figure()
plt.magnitude_spectrum(speech, Fs=fs, color='b', alpha=0.7, label='Original Speech')
plt.magnitude_spectrum(filtered_signal, Fs=fs, color='g', alpha=0.7, label='Filtered Speech')
plt.legend()
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('Speech Frequency Spectrum')
```
通过对比滤波前后的信号,我们可以发现滤波后的信号清晰度更高,噪声被有效地去除了。
最后,我们可以回放滤波后的语音信号,以听出滤波效果:
```python
from IPython.display import Audio
Audio(data=filtered_signal, rate=fs)
```
阅读全文