做通信和雷达接收机这些年,中频采样和数字下变频这对组合几乎天天都要用到。网上搜相关方案,要么是教科书里满屏的公式推导,要么是芯片手册里没人细看的数据表,真正讲清楚"这一级该怎么参数、那一级该怎么选型、上了板子会遇到什么"的资料反而很少。这篇文章我想按工程落地的思路,把这套链路从头到尾捋一遍:什么是中频采样,采样之后的频谱到底搬到了哪里,DDC里混频、滤波、抽取怎么配合,以及一个实际接收机项目里我会怎么定参数、怎么验证。无论你是刚接触软件无线电的学生,还是正在做FPGA数字收发信机的工程师,按这个思路走一遍,至少能把方案阶段那些坑提前踩掉一半。
1. 为什么中频采样是"数字接收机的地基"
1.1 传统超外差接收机留给数字部分的"烂摊子"
稍微有点历史的接收机,基本逃不开超外差结构:天线收到射频信号之后,先经过低噪声放大器(LNA),然后与本振(LO)混频,落到一个固定中频(IF),再用模拟带通滤波器滤出有用信号,最后才交给ADC去采样。这个结构本身很成熟,问题在于"模拟带通滤波器"这一环。窄带滤波器的频率选择性想做得好,成本就蹭蹭往上涨;带宽一旦选死了,换一个信号制式就得换滤波器;温度一变,中心频率还会漂。
我实际项目里的体会是,模拟链路调得再仔细,到了ADC面前仍然是不完美的。相邻大信号的残余分量、镜像频率的抑制余量、本振泄漏,每一处都要占用ADC的动态范围。而数字信号处理最大的好处恰恰是"一致性"——同一个滤波器系数跑一万次结果都完全一样。于是大家自然就想:能不能把模拟滤波器该干的活,尽量往后挪到数字域来做?这就有了中频采样和数字下变频。
1.2 软件无线电理想下的三种ADC接入位置
软件无线电(SDR)的理想很诱人:ADC最好直接贴在天线上,射频信号进来就全数字化,之后信道怎么切都靠软件。但这个理想对ADC的动态范围和功耗要求实在太高——射频直接采样要覆盖几个GHz的带宽,还要在强干扰里保住有用小信号,不是不能做,而是代价大。于是工程上出现了三种折中位置。
| ADC接入位置 | 采样率量级 | 前端复杂度 | 典型应用 |
|---|---|---|---|
| 基带采样 | 低,只采零频附近 | 需要多级模拟下变频+模拟低通 | 窄带数传、传统电台 |
| 中频采样 | 几十~几百MSPS | 一次或两次模拟下变频到中频 | 宽带接收机、雷达、卫星通信 |
| 射频直接采样 | 数GSPS以上 | LNA后直接采射频 | 超宽带、认知无线电 |
中频采样是当前性价比最高的折中点。射频信号通过一到两次模拟变频落到一个固定中频,比如70MHz、140MHz、210MHz这类常用值,然后用ADC去采样这个中频。注意一点:这里ADC的采样率并不需要覆盖140MHz这么高的最高频率,靠带通采样(欠采样)就能把信号折叠到低速率域,这是中频采样和射频直接采样最本质的区别。
1.3 中频采样与DDC的组合拳
ADC把中频信号变成数字序列之后,下一步就是数字下变频(DDC)。DDC干的事情概括起来就是三件:用一个数控振荡器(NCO)产生数字本振,把采样后的中频信号混频搬到基带,再通过抽取滤波器组把数据率降下来。这么做的好处是,原本由模拟滤波器和模拟本振承担的信道选择、邻道抑制,全都可以用一套可配置的数字滤波器完成。改带宽?换系数就行。换信号制式?寄存器重写一遍。
我在方案评审时经常说一句话:中频采样决定了"ADC看到什么",DDC决定了"后面解调器拿到什么"。前者是采样策略问题,后者是数字信号处理链路的架构问题,两者必须放在一起设计。很多初学者把中频采样当成ADC选型时随便定个采样率,把DDC当成一串现成IP核,等到联调时才发现频谱折叠位置不对、抽取后信噪比掉了一截、带外信号混进了带内,追查起来异常痛苦。下面两章分别把这两个关键环节讲透。
2. 中频采样没你想的那么简单:频谱折叠才是关键
2.1 带通采样定理的一句话版本和常见误解
做过ADC选型的人都背熟了一句"采样率至少是最高频率的两倍",这是奈奎斯特采样定理对基带信号的要求。可中频采样是窄带带通信号,直接套这句话会把设计者逼疯——140MHz的中频,按基带定理得至少280MSPS采样,ADC成本和功耗全失控。
带通采样的核心思想是:只要信号本身是带限的,采样率不必覆盖最高频率,只需大于等于两倍信号带宽(fs ≥ 2B),同时保证采样后各次折叠的频谱不重叠。更直白地说,采样过程会让模拟频谱以采样率fs为周期不断复制,那些高于fs/2的"奈奎斯特区"里的信号,都会被映射回第一奈奎斯特区。我们要做的,就是算清楚原本在中频上的信号折叠之后出现在哪个数字频率位置。
这里最常见的误解有两个。一是以为fs只要大于2B就万事大吉,忽略了折叠后位置和镜像重叠的问题;二是把折叠后信号的频谱方向忽略掉——有些奈奎斯特区折叠后频谱是正过来的,有些区是反过来的,这对后面DDC的NCO符号和滤波器带宽对称性都有影响。
2.2 采样率与中频该如何摆放:三准则
我做中频采样方案时,一般只记三条准则:
- 准则一:采样率必须满足fs ≥ 2B,这是理论底线。
- 准则二:折叠后的信号中心频率要落在第一奈奎斯特区的安全位置,既不能贴着直流,也不能贴着fs/2边界,留出保护间隔。
- 准则三:折叠后的信号频谱不能和自身镜像、ADC的谐波、采样时钟泄漏等杂散重叠。
如果信号的中心频率是f_IF,带宽是B,采样率是fs,那么信号会落在第n个奈奎斯特区——这个n等于ceil(f_IF / (fs/2))。折叠后的数字频率f_dig按下面的关系确定:当n为奇数时,信号频率成分是对折回来的正序;当n为偶数时,是反折回来的反序。落在第一奈奎斯特区后,我们得到的就是以f_dig为中心频率的低中频信号,后续DDC的NCO就以这个f_dig为准。
2.3 实例检查:140MHz中频、80MSPS采样的折叠位置
拿实际项目最常见的组合来看:中频140MHz,采样率80MSPS。80MSPS对应的奈奎斯特区边界是40MHz、80MHz、120MHz、160MHz……140MHz落在120~160MHz之间,也就是第4奈奎斯特区。
| 奈奎斯特区 | 频率范围(MHz) | 140MHz折叠后位置 |
|---|---|---|
| 第1区 | 0 ~ 40 | 20MHz |
| 第2区 | 40 ~ 80 | — |
| 第3区 | 80 ~ 120 | — |
| 第4区 | 120 ~ 160 | 20MHz(频谱反序) |
计算很简单:第4区是偶数字,折叠中心等于160-140=20MHz。如果信号占据140±4MHz,那么折叠之后会出现在20±4MHz,也就是16~24MHz这个区间。检查一下:第一奈奎斯特区是0~40MHz,16~24MHz既不碰直流也不贴40MHz边界,余量足够,这是一个完全可以用的组合。
这个例子也解答了一个常见困惑:ADC的采样率明明只有80MSPS,数字域里却出现了一个20MHz的中频信号。这正是带通采样的魔力,它没把140MHz"完整采下来",而是把它"折叠"到了一个我们能处理的低速数字频率上。20MHz这个数字,后面DDC里的NCO频率、抗混叠滤波器的设计起点,全部都要围着它转。
3. 数字下变频的三个动作:混频、滤波、抽取
3.1 为什么需要I/Q双通道:单通道做不了正交解调
DDC的第一步是数字混频。注意这里混的是"数字频率",也就是折叠后的20MHz,而不是模拟的140MHz。ADC出来的数据流x(n)乘上NCO产生的本振信号,就能把20MHz搬回直流附近。
但这里有个非常关键的工程决策:必须做I/Q双通道,也就是复数混频。理由要从实信号的频谱说起。实数中频信号x(n)的频谱是左右对称的,正频率和负频率各有一份。如果你只用cos去混频再接低通,正负两边会被折叠到同一个零频位置,你根本分不清原来频率是+20MHz还是-20MHz,相位信息也会糊掉。雷达多普勒和通信的各种调制信号,恰恰非常依赖频率正负和相位关系。
正确做法是同时产生cos和sin两路本振,分别乘出I路和Q路。用复数记号写,本振就是e^{-j2πf_dig n},等价于cos减去j倍的sin。I、Q两路配合起来,就构成了完整的复数基带信号。后面解调器拿到的是这个复数信号的实部和虚部,幅度、相位、频偏信息一项都不缺。
3.2 NCO设计和数字混频的实现细节
NCO在FPGA里的实现思路非常固定:一个相位累加器,每次累加一个相位增量,拿着累加器的高位去查正余弦查找表。相位增量等于2^B乘以f_dig / fs,B是累加器位宽。用我们80MSPS的例子,f_dig=20MHz,如果相位累加器用32比特,相位增量就是0x20000000,恰好是2^31,非常整齐。
| 项目 | 参数 |
|---|---|
| 采样率fs | 80MSPS |
| 数字中频f_dig | 20MHz |
| 相位累加器位宽 | 32 bit |
| 相位增量 | 536870912(0x20000000) |
| 查找表输出位宽 | 16 bit |
NCO设计里最容易被忽视的是相位截断杂散。相位累加器32位,查找表不可能真的用32位地址,通常只取高14~16位,剩下的低位被截断,这就会在输出频谱中产生杂散。我常用的办法是:取足够的相位位(至少14位),查找表输出做到16bit,再在相位截断处加一个小的随机抖动(dither)把杂散铺成底噪。实测把杂散从-65dBc压低到-75dBc以下是能做到的,代价仅仅是底噪抬高一点点。
混频器本身就是一个乘加器,I路用输入乘cos,Q路用输入乘sin。ADC位宽14bit、本振16bit,乘出来理论上是30bit,但后续滤波器会希望把数据宽度控制住,所以一般在这里就按后续处理位宽做饱和截位。截位的策略直接关系到整个链路的信噪比,这个放到最后一章专门说。
3.3 抽取为什么必须"先滤波后抽取"
混频之后,信号已经落到零频附近,但数据率还是80MSPS。对一个只有8MHz带宽的信号来说,这个速率太浪费了,后级的解调器也扛不住,所以我们想降低数据率。降低数据率的手段是抽取,即每D个点取一个点。
抽取在数学上的效果是让频谱以fs/D为周期延拓。如果抽取前没有把带外成分滤干净,那些分布在0、fs/D、2fs/D附近的频谱分量会直接折进带内,造成所谓的"混叠(aliasing)"。这正是DDC里那句话的由来:先有低通滤波,后有抽取。混频之后、抽取之前,必须用低通滤波器把落在新奈奎斯特区以外的所有能量压下去。
DDC里的滤波不是一道简单的一次性低通,而是多级级联完成的。级联的理由非常直接:高采样率下做陡峭低通,滤波器抽头数量大得惊人,乘法资源吃不消。如果把抽取率拆成几级,每一级在较低速率下做相对缓的滤波,总计算量会小一个量级。这就是下一章要讲的多级抽取滤波器组。
4. 抽取滤波器组的工程分工:CIC负责瘦身、HB负责减半、FIR负责整形
4.1 总抽取率如何分配到各级
仍按80MSPS实例往下走。我们希望DDC输出10MSPS复数基带,所以总抽取率D=80/10=8。这8倍绝不应该用一级FIR去做——在80MSPS下设计一个直接8倍抽取的抗混叠滤波器,过渡带要做到1MHz量级,几百个抽头跑在80MSPS,乘法器资源的开销且先放下,光是时序收敛就能折腾掉一版。
工程上我习惯把8倍拆成"4+2+1"三段:第一级CIC抽取4倍,把80MSPS降到20MSPS;第二级半带滤波器(HB)抽取2倍,把20MSPS降到10MSPS;第三级FIR只做整形和补偿,不再抽取。这样安排的逻辑很清楚:越靠近ADC、数据率越高的位置,越要使用计算量极省的滤波器,宁可其频率响应粗糙一些;越靠近输出的位置,数据率越低,才可以用精细的FIR去处理那些细节。
| 抽取级 | 滤波器类型 | 输入速率 | 输出速率 | 抽取倍数 |
|---|---|---|---|---|
| 第1级 | CIC | 80MSPS | 20MSPS | 4 |
| 第2级 | 半带HB | 20MSPS | 10MSPS | 2 |
| 第3级 | FIR(不抽取) | 10MSPS | 10MSPS | 1 |
4.2 CIC滤波器:只要加法的低通滤波
CIC(级联积分梳状)滤波器是DDC第一级几乎雷打不动的选择,道理只有一个字:省。它的内部只有加法和延迟,没有乘法器,这在FPGA的高速率区域是巨大的优势。
CIC的核心思想是先做积分(1/(1-z⁻¹)),再做梳状差分(1-z^(-RM)),积分的极点可以覆盖整个数字频带,梳状的零点则刚好抵消那些需要抑制的混叠区。级数为N、差分延迟为M、抽取倍数为R的CIC,幅频响应大致是sin(πfRM/fs)与sin(πf/fs)比值的N次方。
一个3级CIC,R=4,M=1,输入14bit,输出位宽要留够。CIC的直流增益是R^N=4³=64,对应6个比特的增益,所以在14bit输入下,CIC内部至少要预留到20bit才不会产生溢出。这是Hogenauer给出的标准位宽规则:每一级积分器都要多留log2(R)比特。代码里如果直接拿14bit往里灌又不扩位,溢出带来的失真会在频谱上表现出明显的高次谐波。
CIC有个天生毛病叫通带滚降(droop)。在我们这个参数下,信号边缘4MHz附近的幅度已经掉了1.6dB,5MHz处掉到了2.6dB。这个量级对很多系统来说是决计不能接受的,但是没关系,CIC本来就只管"大致滤掉远处",通带内的这块损失留给最后的FIR补偿,这是整套链路心照不宣的分工。
4.3 半带滤波器:专门为2倍抽取而生
CIC之后数据率降到20MSPS,我们需要再抽取2倍到10MSPS。这一级采用半带滤波器是再合适不过的。半带滤波器有两条特性和2倍抽取完美契合:第一,它的通带和阻带关于fs_out/2对称;第二,它的奇数序号系数(除中心外)几乎全为零,计算量比同阶FIR直接减半。
半带滤波器的设计指标要配合抽取器来定。抽取2倍后新采样率是10MSPS,新奈奎斯特频率是5MHz,而信号带宽按4MHz算。为了让半带滤波器满足"通带要平、阻带要压住可能混叠进来的6MHz以上分量",我通常把通带设计到4MHz左右,阻带起点放在6MHz附近,这个"4+6=10"正好满足半带滤波器在抽取前采样率20MSPS下的对称条件:fp + fst = fs_in/2。
我见过不少项目在这一级图省事,直接用现成FIR的低通系数硬做2倍抽取,结果阻带位置和半带对称条件不匹配,镜像抑制效果反而比正经半带差。半带这个名字不是营销概念,它是和2倍抽取结构绑定的数学关系,别绕开。
4.4 整形FIR:补偿CIC通带滚降
最后一级FIR在10MSPS下工作,速率已经很低,此时终于可以放心大胆地用高抽头的滤波器。它的任务有两件:一是把CIC造成的1.6~2.6dB下降给补偿回来,二是对信号做最终的频谱整形,把过渡带以外的东西压到系统指标以下。
设计方法并不玄妙,直接用窗函数法或者等纹波法设计一个通带0~4MHz、阻带从5MHz起步、阻带衰减做到60dB以上的FIR,然后在通带内把幅度响应"预失真"成CIC响应的倒数。也就是让最终整体响应等于1除以CIC的droop形状。Kaiser窗,β取6左右,阶数放到80~100,带宽和衰减通常都够用。10MSPS跑100阶FIR,对FPGA来说毫无压力,甚至还能再留出余量做多通道复用。
到这里,整条DDC的骨架就出来了:80MSPS(中频20MHz)→ CIC抽取4 → 半带抽取2 → FIR整形 → 10MSPS复数基带。每一级都清楚自己该干什么,参数也都有了依据。下一章给一套完整可落地的参数和验证清单。
5. 一套可复现的DDC参数设计实例:L波段接收机链路
5.1 设计需求与整体链路指标
假设我们要做一个L波段的通用遥测接收机,射频前端已经一级下变频到140MHz中频。基带调制信号总带宽8MHz,我们希望DDC输出10MSPS的复数基带交给后级解调器。
| 指标项 | 设计值 |
|---|---|
| 中频频率 | 140MHz |
| 信号带宽 | 8MHz(±4MHz) |
| ADC采样率 | 80MSPS |
| ADC位宽 | 14bit |
| DDC输出速率 | 10MSPS(复I/Q) |
| 总抽取率 | 8 |
| 带内平坦度 | 优于±0.5dB(含CIC补偿后) |
| 镜像抑制 | ≥60dBc |
| 带外抑制 | ≥60dBc |
5.2 各级参数的计算与位宽规划
链路级联关系已经很清晰,把每一级的关键参数列成一个表,FPGA里的寄存器位宽、FSW(频率控制字)就都出来了。
| 链路级 | 主要参数 | 位宽规划 |
|---|---|---|
| ADC | 80MSPS,14bit | 14bit输入 |
| NCO/混频 | f_dig=20MHz,相位累加器32bit,查找表16bit | 输出16bit |
| CIC | R=4,N=3,M=1 | 内部最大20bit,输出截16bit |
| 半带 | fp=4MHz,fst=6MHz,18~24阶 | 16bit进,16bit出 |
| FIR | Kaiser,80~100阶,通带补偿CIC | 16bit进,16bit出 |
这里有个细节值得单独说一下:NCO的20MHz是从140MHz折叠过来的频率,不是AD采到的真实模拟频率。FPGA里的频率字严格以80MHz为参考,20MHz对应的归一化相位增量是0.25个周期。如果代码里按140/80=1.75去算,相位增量超过1,那频率就完全是错的,出来的基带频谱会乱得没法看。
5.3 仿真验证流程与Python示例
参数设计完之后,别急着上板,先把链路层面的算法用Python或MATLAB验证一遍。我的习惯分成三步:第一步只加单音,看DDC输出的频谱位置对不对;第二步加带外干扰,看抗混叠有没有失效;第三步加真实调制信号,测EVM。
一个简化的验证代码骨架如下。注意这里用的是复数基带信号模拟路径,和FPGA定点实现可能略有差异,但用来验证参数是正确的。
import numpy as np from scipy import signal fs = 80e6 fd = 20e6 N = 4096 # 1. 构造数字中频单音:140MHz模拟信号采样后折叠到20MHz t = np.arange(50_000) / fs tone = 2.0 * np.cos(2 * np.pi * fd * t) # 2. NCO混频到基带 lo_i = np.cos(2 * np.pi * fd * t) lo_q = -np.sin(2 * np.pi * fd * t) i = tone * lo_i q = tone * lo_q # 3. CIC抽取4(示意:使用级联积分梳状) # 实际FPGA中用级联积分器 + 抽取 + 梳状差分器 d_i = signal.decimate(i, 4, ftype='iir') d_q = signal.decimate(q, 4, ftype='iir') # 4. 半带抽取2以及补偿FIR在此略去,核心是每一级后观察频谱 freq, Pxx = signal.periodogram(d_i, fs=fs/4, window='hann', nfft=4096)跑完单音之后,你会看到DDC输出在零频附近出现一个清晰的峰,旁边就是CIC通带滚降留下的幅度轮廓。如果这个轮廓起伏太大,说明补偿FIR的预失真响应没设计准;如果零频周围多出了对称的杂散峰,先检查NCO杂散和I/Q失配的方向。
5.4 实测前的功能验证
仿真没问题还不能直接放飞板子。我实测前一般会过一遍这样的清单:
- 用信号源给ADC灌一个20MHz的数字中频单音(或者140MHz模拟信号让前端下变频),确认NCO输出频率字正确,基带频谱正好落到零频。
- 观察带内平坦度,如果CIC补偿没生效,输出频谱会看到低频高、高频低的一个"sinc状"倾斜,那是CIC droop的典型特征。
- 在带外比如8MHz处注入一个大信号,确认它不会折叠进带内。这个测试直接暴露抽取滤波器的抗混叠能力。
- 如果后级解调EVM指标过差,把I/Q两路分别抓出来看幅度和相位是否一致,这个用连续波就能测。
这四步跑下来,DDC链路本身的问题基本能定位干净。剩下的才是那些藏得更深、更让人头疼的工程问题,下一章专门讲。
6. 工程里最容易翻车的几个问题:从时钟到截位
6.1 ADC时钟抖动在中频采样时被放大
很多人只盯着ADC的SNR指标,忽略了采样时钟的孔径抖动。ADC内部孔径抖动对信噪比的影响有一个近似关系:SNR_clock ≈ -20log10(2π·f_in·t_jitter)。注意这个f_in在中频采样里是140MHz,不是基带。同样是1ps的抖动,在10MHz基带采样时可能无感,在140MHz中频采样时就已经把SNR限制到了约63dB。换句话说,中频采样对时钟质量的要求比基带采样高得多。
我的建议是:要么用低抖动时钟芯片给ADC专门供一个干净时钟,要么至少保证采样时钟来源的相噪在100kHz~10MHz偏移范围内足够低。板上其他数字信号的回踢、开关电源噪声跑到时钟线上,都会直接变成ADC输出频谱里的底噪抬高。询问时钟源质量时多问一句"抖动RMS是多少飞秒",比纠结ADC标称SNR实在得多。
6.2 NCO杂散干扰带内信号
DDC的三条通道里,NCO最容易遭遇"靠数据手册参数不够用"的尴尬。相位截断、幅度量化、查找表ROM的有限字长,都会在NCO输出上产生杂散。这些杂散被混频器搬移后,可能恰好落在基带信号的通带内,而且一旦落进去,后面任何滤波器都滤不掉——它们已经是"合法带内分量"了。
处理NCO杂散的工程手段主要有三个:提高相位累加器位宽(32位起步),保证相位截断后仍有至少14bit的地址位;查找表输出做到16bit以上;在相位截断位加dither。还有一个偏门但有效的技巧:如果杂散频率是确定的,且正好落在信号带宽内,可以通过调整ADC采样率或者奈奎斯特区的选择,把杂散移出信号带。这属于顶层设计层面的规避手段,建议在方案阶段就评估。
6.3 I/Q失配带来的镜像干扰
DDC链路虽然用的是数字NCO,理论上I/Q是完美正交的,但混频器之前的模拟部分、分级截位造成的定点误差,都会引入幅度和相位失配。失配的直接后果是在频谱上出现一个以零频为对称轴的镜像峰:你在+3MHz处有一个信号,-3MHz处就会冒出一个比它低几十dB的副本。
镜像抑制有一个经典量化关系:幅度失配ΔA和相位失配Δφ都会限制镜像抑制比。如果整个链路想做到60dBc以上的镜像抑制,幅度误差要控制在0.1dB以内,相位误差要控制在0.1°以内,这对模拟前端和ADC自身的平衡度要求都不低。针对这个问题,我通常会在DDC输出端加一个数字校准:注入一个单音,测出I/Q增益比和相位差,然后在数字域做一次简单的补偿旋转。数字校准不增加模拟成本,却是实打实能把镜像抑制拉回指标的招。
6.4 截位点选错,整条链路白做
最后一个问题藏在定点化里,而且特别隐蔽。DDC每一级都在降数据率,每降一次就意味着要截掉一部分位宽。截位点选在哪、截完之后用饱和还是舍入、有没有加抖动,这些看似细节的选择,决定了整个链路的信噪比底限。
我的原则很朴素:CIC内部的字长增长严格按照位宽规则来,不要在积分器中间截位,只在最后输出时一次性截取;混频器之后、CIC之前这个位置因为数据率最高,尽量保留足够位宽;每一级截位都优先用"移出低位+饱和截断"而不是单纯取整,必要时加一点随机dither把量化误差频谱抹平。如果嫌麻烦直接每一步都四舍五入到16bit,最终噪声底会被量化噪声一串串抬高,带内平坦度和SFDR都会给你脸色看。
一点调试心得
文字写到这里,最想提醒的还是那句话:中频采样和数字下变频是一套讲究秩序的系统工程。先算清频谱折叠到哪个数字频率,再定抽取率分配,最后才轮到滤波器系数和位宽。我自己调DDC的顺序永远是先频谱、后星座、再指标,一级一级看输出频谱,确认每一级都没有混叠、没有杂散、没有异常滚降,才敢放后级解调。如果你第一次调这个链路,建议先从"80MSPS采140MHz中频、折叠到20MHz、DDC抽8倍"这个例子入手,把单音信号一路灌进去,亲眼看着频谱从20MHz搬到零频、数据率一级一级降下来,整套逻辑就通了。之后换任何频段、任何采样率,无非是改改频率字和滤波器系数的事。