使用傅里叶变换来识别信号中的频率身分,并据此来过滤掉噪声
发布日期:2024-11-06 16:37 点击次数:59假定咱们有一个包含噪声的音频信号,见地是使用傅里叶变换来识别信号中的频率身分,并据此来过滤掉噪声,终末通过傅里叶逆变换复原出白皙的信号。以下是信号束缚表率。
生成信号
生成一个正弦波信号四肢原始信号。这个信号具有一定的频率和幅值,而且抓续一段本事。再生成一个高频的噪声信号,并将其与原始信号夹杂,以模拟带有噪声的音频信号。
傅里叶变换
使用SciPy库中的fft函数对夹杂信号进行傅里叶变换。将时域信号休养为频域信号,使咱们无意分析信号中的频率身分。绘图频谱图,不雅察夹杂信号的频率散播。在频谱图中,不错看到由原始信号和噪声信号构成的两个主要的频率峰值。
过滤噪声
把柄频谱图,细目要移除的噪声信号的频率界限。在频域中,将对应噪声频率的信号置为零,以去除噪声。
傅里叶逆变换
使用SciPy库中的ifft函数对束缚后的频域信号进行傅里叶逆变换,将其休养回时域信号。绘图束缚后的时域信号波形图,不雅察去除噪声后的恶果。
案例代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq, ifft
# 生成信号参数
SAMPLE_RATE = 44100 # 采样率
DURATION = 5 # 信号抓续本事(秒)
FREQ_SIGNAL = 400 # 原始信号频率(Hz)
FREQ_NOISE = 4000 # 噪声信号频率(Hz)
# 生成本事序列
t = np.linspace(0, DURATION, SAMPLE_RATE * DURATION, endpoint=False)
# 生成原始信号和噪声信号
signal = np.sin(2 * np.pi * FREQ_SIGNAL * t)
noise = 0.3 * np.sin(2 * np.pi * FREQ_NOISE * t) # 噪声信号的幅值为原始信号的0.3倍
# 夹杂信号
mixed_signal = signal + noise
# 傅里叶变换
N = SAMPLE_RATE * DURATION # 采样点数
yf = fft(mixed_signal) # 快速傅里叶变换
xf = fftfreq(N, 1 / SAMPLE_RATE) # 缠绵频率轴
# 绘图频谱图
plt.plot(xf, np.abs(yf))
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude')
plt.title('Spectrum of Mixed Signal')
plt.show()
# 过滤噪声
# 找到噪声频率对应的索引,并将其置为零
target_idx = np.squeeze(np.argwhere(np.abs(xf) == FREQ_NOISE))
yf[target_idx] = 0
# 傅里叶逆变换
inv_yf = ifft(yf)
# 绘图束缚后的信号波形图
plt.plot(t, inv_yf.real) # 取实部四肢束缚后的信号
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Filtered Signal')
plt.show()
栏目分类