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 路,不改会看不到第二路。
五、结论
频移的本质就是乘一个复指数:时域乘