我是一个信号处理新手,我想从频域信号中计算信噪比(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。但我如何才能做到这一点,这是正确的方法吗?
1条答案
按热度按时间fcipmucu1#
根据信号的特性和所需的精度,可以以不同的方式完成。在你的例子中,你可以看到频谱中有用信号的清晰峰值;对于真实的信号,在其频谱中,有用信号可能不能如此清楚地与噪声区分开。
通过分析信号的归一化频谱,您可以根据经验选择的幅度阈值执行简单的滤波。例如,您可以将其视为0.2。
返回时域后,可以使用以下公式计算信噪比: