RRC 滤波器的正确增益是多少?

信息处理 fft 傅里叶变换 频率响应 冲动反应 数字滤波器
2022-02-22 14:22:17

通过阅读以前的问题和谷歌搜索,整个早上都在打破我的大脑......

我从维基百科上的方程式制作了一个 RRC 过滤器。它工作正常,我将它与 python 中的 commpy 库进行了比较。

但我不明白的是频率幅度。

  • RRC 滤波器是否应该具有归一化增益,即通过将脉冲响应除以总和(脉冲响应)得到 0 dB?
  • 或者我应该将 FFT 结果除以 fftsize 吗?
  • 还是我实际上应该不做这两个?

我浏览互联网,许多图像都有很多不同的增益,我无法重现...但我可以重现脉冲和一般频率形状。频率响应只是没有正确垂直移动(以 dB 为单位)以显示与其他图像相同的增益。我错过了什么:(

#Define all parameters needed for RRC
alpha = 0.35 
Fs = Fs
span = 10
sps = 10
num_taps = span*sps
Rs = Fs / sps

#taps must be odd for impulse to be symmetrical on time zero
if not num_taps % 2: num_taps += 1

#time vector
t = np.arange(-((num_taps-1)/2) , (((num_taps-1)/2)+1) , 1) * (1/Fs)

#Root Raised Cosine and deal with special cases
h = np.zeros(len(t))
for element in enumerate(t):
    i,x = element #i holds array index, x holds value of t
    if x == 0: 
        h[i] =  (1 - alpha + (4 * alpha / np.pi))

    elif (alpha != 0 and x == (1 / Rs) / (4 * alpha)) or (alpha != 0 and x == -(1 / Rs) / (4 * alpha)) :
        h[i] = alpha / np.sqrt(2) * ( ((1 + 2 / np.pi) * np.sin(np.pi / (4 * alpha))) + ((1 - 2 / np.pi) * np.cos(np.pi / (4 * alpha))))

    else: #not special cases
        h[i] = (np.sin(np.pi * x * Rs * (1 - alpha) ) + \
                4 * alpha * x * Rs  * np.cos(np.pi * x * Rs * (1 + alpha))) / \
                (np.pi * x * Rs * (1 - (4 * alpha * x *Rs) ** 2 ))

h = h # / np.sum(h) #Should I divide to normalise gain?

#Fourier Transform
fftsize = 4096
f = np.linspace(-Fs / 2, Fs / 2, fftsize) 

H = np.fft.fft(h,fftsize)  #Should I divide by fftsize here?!
H = 10*np.log10( np.abs(H)**2)
H = np.fft.fftshift(H)

#Make the plots
fig = plt.figure()
ax = fig.add_subplot(211)
ax.title.set_text('Raised Cosine Impulse Response')
ax.plot(t,h)
ax.grid(True)

ax = fig.add_subplot(212)
ax.title.set_text('Raised Cosine Frequency Response')
ax.plot(f,H)
ax.grid(True)
4个回答

增益是完全任意的,您可以根据整体接收器或发射器设计的需要对其进行缩放。必须特别注意定点设计,其中最佳做法是让滤波器增大信号 - 不要缩放系数或输入,因为这只会引入更多量化噪声并降低 SNR。让滤波器增长(扩展精度累加器!),然后像任何增益调整一样缩放输出,以使信号电平在使用的精度范围内。

避免精度误差的定点设计的典型设计实践是对系数使用多 2 位量化,在扩展精度累加器中对加权抽头求和,然后将输出缩放到所需的任何水平。在这种情况下,系数的量化(如果与数据路径相同或小于数据路径)将导致实现不满足浮点等效设计给出的预期抑制和通带纹波。通常我们希望抑制大于量化本底噪声,合理的经验法则是可实现的抑制为 5-6 dB/位系数量化。

我在这篇文章中进一步详细说明了量化误差的贡献(这样您还可以查看是否要限制累加器精度,因为量化噪声和累加器精度之间的交易更加清晰,所以您可以在多次抽头后进行缩放,但总的来说无需进一步计算的最安全/最简单的方法就是等到输出并让累加器log2(N)+2精度高于数据路径,其中 N 是滤波器中的抽头数。

滤波器间位宽

这在 FIR 滤波器设计的一般方法的上下文中进一步详细说明:

过滤器的合适设计方法是什么?

下图展示了典型低通 FIR 滤波器的量化效果。这促使“最佳实践”在数据路径中使用的系数上多使用 2 位量化,并且滤波器中的噪声求和过程促使使用扩展精度累加器并让滤波器增长信号(然后在最后)如上面的链接中详述:

16位系数

8位系数

我的建议是将滤波器脉冲响应归一化,使其能量等于 1。

在连续时间内,数字通信系统将传输一个符号ai使用脉冲

s(t)=aip(t),
在哪里p(t)是一个 RRC 脉冲。接收器将恢复ais(t)使用匹配的过滤器:

ai=aip(t)p(t)dt=aip(t)p(t)dt=aiEp,
在哪里Ep是脉冲的能量p(t). 如果Ep=1,则匹配滤波器的输出等于传输的符号。否则,您需要将符号缩放一个因子1/Ep.

我建议将滤波器的输入和输出置于同一级别(包括重采样)。这意味着线性增益为 1 或 0 dB。

它是一致的并且对重用很有用。

初步验证低通滤波器增益的最佳方法是注入直流恒定信号。

通常,我调整抽头电平以补偿增益的小数部分。我在滤波器的输出处使用左移或右移来获取增益的整数部分(带有舍入)。

如果其他三个(在撰写本文时)答案不明显:将其缩放以匹配他手头的问题。 到目前为止,所有三个建议的缩放比例(能量 = 1,DC 增益 = 1,最大系数 = 数据类型的满量程,然后缩放输出)在不同的情况下都是有效的。

并且不要为试图找到一种通用的“正确”方法而烦恼:没有一个。只需了解过滤器背后的原因,并使其适用于您的应用程序。