numpy 如何在给定截止频率的情况下计算频域信噪比?

5cnsuln7  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(108)

我是一个信号处理新手,我想从频域信号中计算信噪比(SNR)。

import matplotlib.pyplot as plt
import numpy as np

# create signal in time domain
N = 1000
T = 0.05
x = np.linspace(0, N*T, N)
y = 10 * np.sin(0.1 * np.pi * x)

noise = 2* np.random.normal(size=len(x))
y += noise

# signal in frequency domain
N = len(y)
x_f = np.fft.rfftfreq(N, d=T)
y_f = np.fft.rfft(y)
# normalize
x_f = x_f / max(x_f)
y_f = np.abs(y_f) / max(np.abs(y_f))

这个想法是使用截止频率(例如,0.3),以将信号划分为有用信号(左侧)和噪声信号(右侧),并计算SNR。但我如何才能做到这一点,这是正确的方法吗?

fcipmucu

fcipmucu1#

根据信号的特性和所需的精度,可以以不同的方式完成。在你的例子中,你可以看到频谱中有用信号的清晰峰值;对于真实的信号,在其频谱中,有用信号可能不能如此清楚地与噪声区分开。
通过分析信号的归一化频谱,您可以根据经验选择的幅度阈值执行简单的滤波。例如,您可以将其视为0.2。

threshold = 0.2
y_f_filtered = y_f.copy()
y_f_filtered[y_f < threshold] = 0

返回时域后,可以使用以下公式计算信噪比:

y_filtered = np.fft.irfft(y_f_filtered)
signal_power = np.sum(y ** 2)
noise_power = np.sum((y - y_filtered) ** 2)
snr_db = 10 * np.log10(signal_power / noise_power)

相关问题