Frequency Shifting by gnuradio

一句话:在时域把信号乘以一个复指数,就等于在频域把整个频谱”平移”一段距离。

一、背景:为什么要做频移

频移是 SDR 里最基础的操作之一。想把某个频段搬到基带处理、想在频谱上”挪个位置”,都离不开它。

实现频移的方法有好几种,这篇文章只讲最简单也最本质的一种:乘以复指数正弦波。

二、原理:乘复指数 = 频谱搬移

数学依据就一行:

也就是:时域乘以 ,频域整体右移 。

  • :频谱向右(高频方向)搬;
  • :频谱向左(低频方向)搬。

理解这一点,后面整个流图就只是”照着公式连线”而已。

三、动手:复现步骤

1. 准备源信号

先搭一个输入源:一个 10 MHz 的噪声源 + 一个低通滤波器,组成一段带限的基带信号。

为什么先加低通?因为后面要观察频谱搬移,先给信号限定一个清楚的带宽,搬移效果才看得清。

2. 生成复正弦波

加入一个 Signal Source 作为复正弦波,用于频率偏移:

  • Output Type:Complex
  • Frequency:变量 new_center_frequency

新增变量:

  • new_center_frequency = 1M

复正弦必须设成复数输出,否则拿不到 的效果。

3. 先单独看复正弦波

把 Signal Source(复正弦)接到 QT GUI Frequency Sink 上。

如果 Frequency Sink 只有一个输入口,双击它把 Number of Inputs 改成 2,就能同时看两路信号。

可以看到复正弦波就在 1 MHz 附近——这就是”搬移量”。

4. 加入乘法器,完成频移

根据上面的公式,乘法器需要两个输入:一路是低通滤波后的信号,一路是 1 MHz 的复正弦,输出给 Frequency Sink。

运行后可以看到频谱整体被搬移了。

5. 用滑块验证方向

既然正数向右搬,那负数应该向左搬。把 new_center_frequency 这个 Variable 禁用(disable),改用 QT GUI Range 动态调节:

拖动滑块,观察频谱左右移动,验证 的符号决定搬移方向。

四、常见坑与边界

  • Signal Source 必须是复数输出。用实数正弦乘以信号,只会得到双边带调制,而不是干净的频谱平移。
  • 频谱是周期性的。频移超过采样率范围时,频谱会从另一头”绕回来”(因为离散频谱本身是循环的),不是无限平移。
  • 采样率要足够。搬移后的信号频率不能超出奈奎斯特范围,否则会混叠。
  • Frequency Sink 多路显示要先改 Number of Inputs,默认是 1 路,不改会看不到第二路。

五、结论

频移的本质就是乘一个复指数:时域乘 ,频域整体搬 。正负号决定搬移方向,采样率决定能搬多远。把这个公式记牢,后面做下变频、信道搬移都是同一个套路。