我有一个传入的数字采样正弦波脉冲,所以我的 FPGA 具有来自 I 和 Q 通道的 ADC 电平。我希望能够将相位移动任意数量。
- 最有效的方法是什么?
移相最明显的方法就是乘以,但这会很慢而且很浪费。我还看到有人推荐使用带有一些相移的全通滤波器。
- 我应该考虑其他选择吗?或者全通滤波器是最好的方法吗?
我有一个传入的数字采样正弦波脉冲,所以我的 FPGA 具有来自 I 和 Q 通道的 ADC 电平。我希望能够将相位移动任意数量。
移相最明显的方法就是乘以,但这会很慢而且很浪费。我还看到有人推荐使用带有一些相移的全通滤波器。
您描述的全通是多个数字的乘法。因此,如果您想改变相位,唯一在数学上可行且最简单的方法确实是与相乘。
我不明白为什么这会太慢——在现代 FPGA 中,您可能会利用 DSP 切片来执行(实值)两个乘法和加法,从而构成一个复杂的复数乘法。
现在,如果你需要增加你的相位,所以你需要先*计算的值,那么可能还有优化的空间。事实上,数字调谐发生在 FPGA 中,在 Ettus USRP 系列等软件定义无线电设备的 DSP 链中。
在那里,采用了一种非常标准的 CORDIC 算法来逼近任意相对频率。看看 USRP X3xx 的 GPL 许可RX DSP DDC 链:
cordic_z24 #(.bitwidth(cwidth))
cordic(.clock(clk), .reset(rst), .enable(run),
.xi(to_cordic_i),. yi(to_cordic_q), .zi(phase[31:32-zwidth]),
.xo(i_cordic),.yo(q_cordic),.zo() );
这cordic_z24实际上只是具有预先计算的 atan 系数的多级CORDIC 实现。
即使在 2005 年的 Spartan FPGA 上,它也能以复杂的 64MS/s 运行,而在现代 Kintex7 FPGA 上大约 200MS/s 的速度几乎不会眨眼。
它完全避免了显式乘法。
我同意马库斯所说的大部分内容。如果 FPGA 是为 DSP 应用设计的(因此有可用的 DSP 片),现代 FPGA 中的复数乘法不会太慢或效率低下。另一方面,如果您没有现成的乘加解决方案,那么 Marcus 建议的 CORDIC 算法是实现目标的典型方法。在完全流水线实现中运行的 CORDIC 块将比复杂乘法器解决方案具有更多的延迟,但在您没有专用 DSP 片可供使用的情况下,它将需要更少的 FPGA 架构。您需要实时调整相位吗?之前的两种解决方案都可以做到这一点。此外,一个可调的全通滤波器可以实现这一点,但请记住,它需要更多的内存和大量的乘加操作。所以,最后,它可能不会比单一的复数乘法方法更有效或更快。一种可能可以接受(如果正弦频率相对较慢)并且肯定会更简单的全通滤波器是可变延迟。如果您需要比单个样本更精细的相移,那么您可以通过分数插值滤波器来实现。例如,看看 Farrow 结构。您需要权衡这种结构的成本与 CORDIC 和复杂的乘法方法。这在您处理约束的项目中很容易做到,但在没有提供更多细节的情况下很难在一般情况下做到。一种可能可以接受(如果正弦频率相对较慢)并且肯定会更简单的全通滤波器是可变延迟。如果您需要比单个样本更精细的相移,那么您可以通过分数插值滤波器来实现。例如,看看 Farrow 结构。您需要权衡这种结构的成本与 CORDIC 和复杂的乘法方法。这在您处理约束的项目中很容易做到,但在没有提供更多细节的情况下很难在一般情况下做到。一种可能可以接受(如果正弦频率相对较慢)并且肯定会更简单的全通滤波器是可变延迟。如果您需要比单个样本更精细的相移,那么您可以通过分数插值滤波器来实现。例如,看看 Farrow 结构。您需要权衡这种结构的成本与 CORDIC 和复杂的乘法方法。这在您处理约束的项目中很容易做到,但在没有提供更多细节的情况下很难在一般情况下做到。看看法罗结构。您需要权衡这种结构的成本与 CORDIC 和复杂的乘法方法。这在您处理约束的项目中很容易做到,但在没有提供更多细节的情况下很难在一般情况下做到。看看法罗结构。您需要权衡这种结构的成本与 CORDIC 和复杂的乘法方法。这在您处理约束的项目中很容易做到,但在没有提供更多细节的情况下很难在一般情况下做到。