使用傅里叶变换来识别信号中的频率身分,并据此来过滤掉噪声
虎嗅网洞察

虎嗅网洞察

让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

使用傅里叶变换来识别信号中的频率身分,并据此来过滤掉噪声

发布日期: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()