上采样(插入零)信号的低通滤波

信息处理 有限脉冲响应 插值
2022-02-06 19:12:58

很长一段时间以来,我一直在研究 python 中的插值。输入信号是以 933KHz 采样的正弦信号。我将信号上采样 5 倍,然后使用带有 Kaiser 窗口的 F​​IR 低通滤波器。

我在这里观察到两个问题:

  1. FIR 滤波器的输出被插值因子衰减。在我的情况下,乘以 5 倍。将 FIR 系数乘以插值因子正在修复它。但是,我想知道为什么会这样。
  2. 此外,截止频率似乎也移动了 5 倍。FIR 滤波器的截止频率约为 25KHz。但是上采样信号似乎只在 125Khz 之后才衰减。我通过过滤原始信号(没有上采样)验证了 FIR 设计是否正常,它似乎很好。当正弦波的频率高于 25Khz 时,如果频率低于 25Khz,我会看到衰减和零衰减。

我在这方面有点新手,任何进一步研究的建议也会有帮助。

代码片段:

Fin = 25 * 10 ** 3
Fs = 933.0 * 10 ** 3

N = 100
L = 7

### input signal
n = np.linspace(0, N, num=N)
x_input = np.sin(2 * np.pi * Fin * 1/Fs * n)

## upsampling
x_input_upsampled = up_sample(x_input, N, L)  ===> just a module written by me. does simple matrix multiplication to achieve upsampling.

##### Kaiser window
# The Nyquist rate of the signal.
nyq_rate = Fs / 2.0
# The desired width of the transition from pass to stop,
# relative to the Nyquist rate.  We'll design the filter
# with a 5 Hz transition width.
width = 5.0/nyq_rate
# The desired attenuation in the stop band, in dB.
ripple_db = 100.0
# Compute the order and Kaiser parameter for the FIR filter.
from scipy.signal import kaiserord
numtaps, beta = kaiserord(ripple_db, width)
window = ('kaiser', beta)


#### FIR filter
cutoff = 25 * 10 ** 3
cutoff_normalized = cutoff/nyq_rate
## firwin
h_windowed = signal.firwin(numtaps, cutoff_normalized, window=window)

interpolated_y = np.convolve(x_input_upsampled, h_windowed)

问候, Pradeep MC

1个回答

我没有查看您的整个代码,但根据您的描述,我相信您所看到的内容是预期的,并用下图进行了解释。

上半部分显示了 DC 独特频率跨度中的示例数字频谱到Fs在哪里Fs是采样率。(如果我们考虑频率跨度从+我们会看到这个光谱会复制,因此我们通常只在这个范围内显示它,或者从Fs/2+Fs/2.

然而,发生的复制有助于理解当我们插入零以通过因子 N 进行上采样时会发生什么。这简单地将频率转移到NFs同时保持光谱完整无缺。(因此通过插入零而不是进行零阶保持来进行上采样的原因,这意味着保持相同的值,因为它具有低通滤波效果)。当我们将采样率更改为NFs通过插入N1每个样本之间的零,采样率如预期的那样高,但整个频谱保持不变,现在作为我们的主要采样频谱的一部分,从 0 到我们的新采样率NFs因此是不想要的图像,必须过滤掉才能完成插值。这显示在下图中,其中N=5就像你的情况一样。

插值

在时域中,信号的幅度在零插入后保持不变,但它的能量分布在频率上,因此在过滤掉图像后,幅度会降低,如您所见。

这很清楚,看看你是否考虑所有的直流信号:

1 1 1 ...

零插入后N=5这变成

1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ...

在零插入之前,峰值幅度为 1,平均值也是 1。在零插入之后,我们有相同的峰值幅度,但平均值(这是一个低通滤波器,在这种情况下是 DC 值的估计值)现在只有 1 /5!

在频域中继续该示例,下面是一百个 [1 1 1 1 ....1] 的 FFT 的绝对值,正如预期的那样,结果在第一个 bin (DC) 中,并且是FFT 公式中表示的样本:

FFT 100 1s

下面是插值因子为 5 的零插入后的相同结果。这里我们看到发生的频率复制,但请注意结果仍然是 100,即使我们有 500 个样本而不是 100,重要的是,这被复制 5 次。

FFT 100 1s 零插入 5

低通滤波器可能会去除较高的频率,从而在 FFT 中留下 100 的幅度,从而获得 500 个样本的 FFT。(FFT 通常由样本数归一化,以使 FFT 幅度等于时域信号的幅度;第一种情况的归一化 FFT 将是100/100=1, 和100/500=0.2对于插值的情况。

要回答您的第二个问题,请知道数字滤波器将随采样率缩放。所以无论你有什么结果Fs当您运行过滤器时将缩放为NFs. 这就是为什么使用分数频率轴(0 到 1 对应于 0 到Fs或 0 到2π对应于等效角频率。