GnuRadio 的 SNR 估计器使用

信息处理 信噪比 格努拉迪奥
2022-02-25 03:06:06

我正在尝试使用 GRC 计算卫星信号的 SNR,但所有 4 个提供的估计器要么有很多-NaN值,要么在整个记录过程中约为 35dB。(我刚刚将文件源连接到 MPSK SNR 估计器探针并将消息重定向到消息调试。)

我已经尝试了适合我输入的示例,M2M4 估计器吐出了一些预期值(所以公司的其他人告诉了我)。

编码:

from sys import argv
from scipy import fromfile, absolute, array_split, mean, sqrt, log10, ceil, linspace, complex64
from matplotlib import pyplot as plt

def snr_est_m2m4(signal):
    M2 = mean(absolute(signal)**2)
    M4 = mean(absolute(signal)**4)
    snr_rat = sqrt(2*M2*M2 - M4) / (M2 - sqrt(2*M2*M2 - M4))
    return 10.0*log10(snr_rat)

def chunkify(lst, chunk_size):
    return [lst[i * chunk_size : (i+1) * chunk_size] for i in range(int(ceil(len(lst)/chunk_size)))]

def main():
    if len(argv) != 2:
        return
    bits = fromfile(argv[1], dtype=complex64)
    m2m4_axis = [absolute(snr_est_m2m4(s)) for s in array_split(bits, 100000)]

    f1 = plt.figure(1)
    s1 = f1.add_subplot(1,1,1)

    chunk_size = 100
    smooth_m2m4 = [mean(c) for c in chunkify(m2m4_axis, chunk_size)]
    s1.plot(linspace(0, 1000, len(smooth_m2m4)), smooth_m2m4, 'b-', label='m2m4')
    s1.grid(True)
    s1.set_xlabel('time')
    s1.set_ylabel('snr')
    s1.legend()
    print("Done!")
    plt.show()

if __name__ == "__main__":
    main()

我收到的输出: python_m2_m4_estimation

我知道录音是有效的,因为我们目前实施的 GRC 链给出了地球的图像。我已经在不同的信号上尝试了估计器,但再一次,这些值没有意义;无信号时信噪比较高。

GRC中的参数alphaSamples between SNR messages代表什么?为什么 GRC 中的估算器不能按预期工作?计算 SNR 的建议方法是什么?

我在这里不知所措,请发送帮助。

1个回答

该区块的官方文档

使用二阶 (M2) 和四阶 (M4) 阶矩的 M-PSK 信号的 SNR 估计器。该估计器使用信号峰度 (和噪声 ( ) 的知识来进行估计。我们在这里对 M-PSK 信号和 AWGN 通道使用 Beaulieu 近似,使得这些近似值显着降低了所需计算(和计算)的复杂性。ka)kwka=1kw=2

参考: DR Pauluzzi 和 NC Beaulieu,“AWGN 信道 SNR 估计技术的比较”,IEEE Trans。通讯,卷。48,第 10 期,第 1681-1691 页,2000 年。

构造函数的文档隐约暗示:

alpha 内部运行平均计算的更新率。”

即可能是具有反馈系数 alpha 的单击 IIR(“指数加权移动平均线”)。

使用源代码验证

for(int i = 0; i < noutput_items; i++) {
    double y1 = abs(input[i])*abs(input[i]);
    d_y1 = d_alpha*y1 + d_beta*d_y1;

    double y2 = abs(input[i])*abs(input[i])*abs(input[i])*abs(input[i]);
    d_y2 = d_alpha*y2 + d_beta*d_y2;
}

是的,那个 alpha 只是单击 IIR 的系数(进一步你会发现d_beta = 1 - d_alpha)。

所以,这个估计器应该完全按照它的承诺:对于一个零均值信号(其中方差只是),它计算第二个和第四个中心矩,然后只是Var X=E(X2)

double
mpsk_snr_est_m2m4::snr()
{
  double y1_2 = d_y1*d_y1;
  d_signal = sqrt(2*y1_2 - d_y2);
  d_noise = d_y1 - sqrt(2*y1_2 - d_y2);
  return 10.0*log10(d_signal / d_noise);
}

因此,它执行通常的基于峰度的估计。

顺便说一句,我完全同意参数文档——说得友好一点——还有一点改进的余地。如果您愿意为文档改进做出一些贡献,请联系我们/我!