为什么我在 GNU Radio 中只从 VCO 块中得到零?

Why am I getting only zeros out of the VCO block in GNU Radio?

在 GNU radio 中,我试图使用一个信号的频率来生成另一个不同频率的信号。这是我正在使用的流程图:

我使用信号源块生成一个 50 kHz 信号,并将其馈入对数功率 FFT 块。我使用 Argmax 块找到功率最大的 FFT bin,并将其乘以一个常数。我想使用这个结果作为复数 vco 模块的输入来生成另一个具有不同频率的信号。所有向量的长度都是 4096。

但是,查看复杂QT Gui Time Sink 块的输出,vco 的输出始终为零。这对我来说很奇怪,因为使用 float QT Gui Time Sink 来查看乘法块的输出(也将进入 vco 块的输入),结果如预期的那样为 50,000。为什么我从 vco 中得到的结果仅为零?

此外,我的采样率设置为 1M。由于矢量长度为 4096,我假设 Argmax 块的采样率将为 1M/4096 = 244。这是正确的吗?

我是 运行 windows 10 上的 gnu 无线电伴侣。

看起来更好的解决方案是使用探测信号块和函数探测块来探测乘法器的输出以创建新变量。这个变量然后可以用作用于生成新信号的单独信号源块中的频率值。这个流程图似乎满足了最初的预期目的:new flow diagram

建议的解决方案不是解决方案。请不要滥用信号探测器,它实际上只是一个用于缓慢、调试或纯粹视觉目的的探测器。每次我自己使用它时,我都看到它在架构上有多糟糕,我个人认为该项目应该将它从块库中完全删除。

现在,不只是说 "probe is bad, do something else",让我们分析一下您的流程图在哪里不足:

  • 您的频率估计取决于用于纯可视化目的的块的 argmax。不,输出率不是(采样rate/FFT长度),输出率大约是"frame rate"(但实际上不完全是。那个块很糟糕,混合了"sample times"和"wall clock times" ).不要那样做。如果您需要类似的东西,请使用 FFT 块,然后是我的 "complex to magnitude squared"。您甚至 不需要 对数 - 您只是在寻找最大值
  • 不是在 FFT 中寻找最大绝对值,它本质上是一个量化频率估计器,而是使用实际给你振荡的东西。您可以通过多种方式使用 PLL 来做到这一点!
  • 您的 VCO 解决方案可能会执行它的编程任务。你只是用的不够灵敏!
  • 你假设的采样率在你的时间下沉时完全不对,这可能就是为什么你有一个恒定输出的印象——它只是变化得太慢以至于你不会注意到。

因此,我建议改用 / 或:

  • 使用 PLL 频率检测器。将其输出馈入 VCO。不要用常数缩放,而只是应用适当的灵敏度。灵敏度是 "input amplitude" 和 "phase advance per sample on the output in radians" 之间的因数。
  • 使用PLL 载波恢复。使用重采样器或其他一些数学方法来生成新频率。你没有告诉我们其他频率与输入频率有什么关系,所以我不能给你具体的建议。

另请注意,这非常表明这是 "I'm trying to recreate an analog approach in digital" 的情况; 可能是个好方法,但在很多情况下并非如此。

如果我可以这么厚颜无耻:请描述 为什么 您需要生成其他频率,为此目的,在 https://dsp.stackexchange.com or to the GNU Radio mailing list discuss-gnuradio@gnu.org (sign up here 上的 post 中) .这实际上只是一个编程问题,但实际上是一个信号处理问题。并且有很多人渴望帮助您找到真正解决您问题的合适解决方案!