简介:这份资源是面向2023年全国大学生电子设计竞赛信号题参赛者的备赛资料包,适合具备一定嵌入式与数字信号处理基础、希望系统梳理赛题思路的选手。内容围绕信号处理理论与STM32H7平台实践展开,涵盖信号采集、频域分析、滤波器设计、调制解调等典型考点,并配有基于STM32H7的工程源码,便于读者对照理解实时信号处理流程与硬件接口配置。压缩包共约2000个文件,以C源码和头文件为主,辅以说明文档与少量C++、网页文件,整体约333.54MB,目录结构清晰,便于按模块检索。目前已有1029人学习下载,可作为赛前理论复习、代码调试与方案验证的参考,帮助读者快速搭建实验环境、理解算法实现细节并积累排错经验。
1. 信号题备赛:从“能跑通”到“能拿奖”的分水岭在哪
2023年电赛信号题的准备,很多人一上来就扎进代码和电路里,结果比赛时才发现——题目考的根本不是你“会不会做”,而是“能不能在四天三夜里稳定做出来”。信号题在电赛里属于那种“入门容易、拿奖难”的方向,因为它的评分点极其密集:从模拟前端的信噪比,到ADC采样后的算法处理,再到输出波形的失真度,每一环都有明确的量化指标。你如果只是让系统“跑通”了,可能连省赛都出不去;真正拉开差距的,是那些在备赛阶段就把“参数边界”和“异常场景”摸透的人。这份准备资料的核心价值,就是帮你把信号题从“玄学调参”变成“可复现的工程流程”。它适合已经做过基础训练、但一到综合题就手忙脚乱的人,也适合想冲国奖、需要把每个模块的余量都算清楚的队伍。接下来的内容,我会按考点分布、高频题型、易错点和答题节奏来拆,你直接照着练就行。
2. 考点分布:信号题到底在考哪几个模块
2.1 模拟前端:放大、滤波与阻抗匹配的硬指标
信号题的第一道坎永远在模拟部分。很多队伍一上来就想着用单片机做所有事,结果发现输入信号还没进ADC就已经被噪声淹没了。备赛时你必须把这三个指标刻在脑子里:输入阻抗、带宽、噪声系数。比如题目要求采集一个10mVpp的小信号,你的前端如果输入阻抗只有10kΩ,那信号源内阻稍微大一点,分压就直接把信号吃掉了。正确的做法是先用高输入阻抗的缓冲级(比如运放跟随器)隔离,再进放大级。
放大级的设计要看增益带宽积。假设你用一款GBW=10MHz的运放,要放大100倍,那闭环带宽只剩100kHz。如果信号里含有200kHz的成分,它就会被衰减掉,后面算法再厉害也补不回来。滤波器的阶数也要根据干扰频率来定:如果工频干扰在50Hz,而你的信号在1kHz,那一个二阶高通就够了;但如果干扰和信号频率只差几十Hz,就得考虑四阶甚至更高,或者用带通+陷波的组合。
提示:备赛时一定要用网络分析仪或扫频法实测前端的幅频特性,不要只靠仿真。仿真里的理想运放和实际运放的寄生参数差很多,尤其是高频段。
阻抗匹配在信号题里经常被忽略。如果是射频类信号题,50Ω匹配是硬性要求;如果是低频传感器信号,重点则是阻抗变换——让前级输出阻抗远小于后级输入阻抗,通常至少差10倍以上。备赛时建议准备几种不同阻抗的转接板,比赛时直接插拔,比临时飞线靠谱得多。
2.2 采样与量化:ADC选型与时钟抖动的坑
ADC选型不是“位数越高越好”。你要算的是有效位数和采样率的匹配关系。比如一个12位ADC,标称采样率1MSPS,但如果你只用到100kSPS,有效位数可能反而更高,因为量化噪声被平均了。反过来,如果你硬跑1MSPS,有效位数可能掉到10位以下。备赛时要养成看ENOB曲线的习惯,而不是只看数据手册第一页的“12位”。
时钟抖动是信号题里的隐形杀手。假设你采样一个100kHz的正弦波,时钟抖动如果是1ns,那信噪比理论上限只有约74dB;如果抖动降到100ps,上限就提高到94dB。很多队伍用单片机内部RC振荡器做ADC时钟,抖动可能到几纳秒,结果FFT一出来底噪高得吓人,还以为是算法问题。正确的做法是用外部晶振或专用时钟芯片,并且时钟走线要远离数字信号线。
// 以某款常用MCU为例,配置ADC时钟为外部晶振分频 // 假设外部晶振为8MHz,目标ADC时钟为16MHz(需确认芯片上限) void ADC_ClockInit(void) { RCC->CFGR &= ~RCC_CFGR_ADCPRE; // 清除ADC预分频位 RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; // 8MHz * 2? 实际是PLL后分频,此处示意 // 关键:使能外部高速晶振作为PLL源,而不是内部HSI RCC->CR |= RCC_CR_HSEON; while(!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE稳定 // 后续配置PLL倍频到目标频率,再分配给ADC }上面代码的关键点在于时钟源选择。内部RC振荡器虽然省事,但温漂和抖动都大;外部晶振的稳定性通常高一个数量级。参数上你要关注:晶振的负载电容匹配、起振时间、以及分频后是否超过ADC的最大时钟频率。如果比赛时发现FFT底噪异常,第一件事就是查时钟源是不是被默认设成了内部RC。
2.3 算法处理:FFT、滤波与参数估计的实时性
信号题的后半段基本就是算法战场。FFT是最常用的工具,但很多人栽在频谱泄漏和栅栏效应上。比如你要测一个1kHz信号的幅值,如果采样点数不是整数个周期,峰值就会泄漏到相邻频点,测出来的幅值偏低。解决办法是加窗(汉宁窗或平顶窗),但加窗又会展宽主瓣,降低频率分辨率。备赛时要根据题目要求权衡:测幅值优先用平顶窗,测频率优先用汉宁窗或矩形窗。
滤波器的实现也有讲究。IIR滤波器计算量小,但相位非线性,可能让波形失真;FIR滤波器可以做到线性相位,但阶数高时计算量大。如果MCU主频只有几十MHz,建议用二阶节级联的IIR,或者用查表法实现简单的FIR。实时性方面,要算清楚一帧数据的处理时间:假设采样率100kSPS,每帧1024点,那你有10.24ms的时间完成FFT+参数计算+输出更新。如果FFT本身就要8ms,那留给其他环节的余量就很少了。
import numpy as np # 模拟:采样率100k,信号1kHz,采样1024点 fs = 100000 N = 1024 t = np.arange(N) / fs sig = 0.5 * np.sin(2 * np.pi * 1000 * t) + 0.1 * np.sin(2 * np.pi * 3000 * t) # 不加窗的FFT fft_raw = np.fft.fft(sig) # 加汉宁窗 window = np.hanning(N) fft_win = np.fft.fft(sig * window) # 计算幅值谱(归一化) mag_raw = np.abs(fft_raw[:N//2]) / (N/2) mag_win = np.abs(fft_win[:N//2]) / (N/2) * 2 # 汉宁窗补偿系数约2 # 打印1kHz和3kHz处的幅值 freqs = np.fft.fftfreq(N, 1/fs)[:N//2] idx_1k = np.argmin(np.abs(freqs - 1000)) idx_3k = np.argmin(np.abs(freqs - 3000)) print(f"不加窗: 1kHz={mag_raw[idx_1k]:.3f}, 3kHz={mag_raw[idx_3k]:.3f}") print(f"加汉宁窗: 1kHz={mag_win[idx_1k]:.3f}, 3kHz={mag_win[idx_3k]:.3f}")这段代码演示了加窗对幅值测量的影响。不加窗时,如果信号频率不是频率分辨率的整数倍,幅值会明显偏低;加汉宁窗后,幅值更接近真实值,但主瓣变宽,频率分辨率下降。备赛时你要根据题目是“测幅值”还是“测频率”来选择窗函数。参数上注意:汉宁窗的幅值补偿系数约为2,平顶窗约为1.5左右,具体要查窗函数定义。
3. 高频题型:五类信号题真题的答题模板
3.1 波形发生器类:从DDS到滤波器的完整链路
波形发生器是信号题里出现频率最高的题型之一。题目通常要求输出正弦波、方波、三角波,并满足一定的频率范围、幅值范围和失真度指标。答题链路是:DDS芯片或MCU的DAC → 重构滤波器 → 幅度控制 → 输出驱动。
DDS方案里,AD9833、AD9850是常用芯片,但要注意它们的输出是电流型,需要外接运放做I-V转换。如果用MCU的DAC,那就要算清楚更新率:假设你要输出1MHz的正弦波,每个周期至少需要10个点,那DAC更新率就要10MSPS。很多MCU的DAC根本达不到这个速度,这时候就要用DMA+定时器的方式,让DAC自动从缓冲区取数,CPU只负责填表。
重构滤波器是失真的关键。DDS输出的是阶梯波,含有大量高频谐波,必须用低通滤波器滤掉。截止频率通常设为输出最高频率的1.2到1.5倍,阶数至少四阶。如果题目要求失真度小于1%,那滤波器还要更陡。备赛时建议直接做一块可切换截止频率的滤波板,用模拟开关切换电容或电阻,比赛时根据输出频率调整。
注意:方波和三角波的谐波成分更丰富,重构滤波器的截止频率要更高,否则边沿会变圆。但截止频率太高又滤不干净阶梯谐波,需要折中。
答题模板可以这样组织:先写“本设计采用DDS芯片AD9833产生正弦波,通过四阶巴特沃斯低通滤波器抑制谐波,截止频率设为最高输出频率的1.5倍,实测失真度在1MHz时小于0.8%”。然后附上滤波器参数计算和实测波形。面试官或评委最想听的是你如何权衡截止频率和失真度,而不是你用了什么芯片。
3.2 频谱分析类:FFT分辨率与实时显示的平衡
频谱分析题通常要求对输入信号做FFT,显示频谱并测量峰值频率和幅值。核心矛盾是频率分辨率和刷新率。频率分辨率 = 采样率 / 采样点数。如果你要分辨间隔100Hz的两个信号,那分辨率至少100Hz,假设采样率100kSPS,那采样点数就要1000点以上。但点数越多,FFT计算时间越长,刷新率就越低。
备赛时要准备两套参数:一套高分辨率模式(比如4096点,刷新率5Hz),一套高刷新率模式(比如1024点,刷新率20Hz)。比赛时根据题目要求切换。如果题目要求“实时显示”,那通常刷新率要10Hz以上,这时候点数就不能太多。
// 以某款DSP为例,配置FFT点数与采样率 #define FFT_SIZE 2048 #define SAMPLE_RATE 100000 // 100kSPS // 频率分辨率 = 100000 / 2048 ≈ 48.8Hz // 如果要求分辨率优于10Hz,则FFT_SIZE至少10000,但计算时间会很长 void FFT_Process(int16_t *adc_buf, float *mag_out) { // 加汉宁窗 for(int i=0; i<FFT_SIZE; i++) { float w = 0.5f * (1 - cosf(2*M_PI*i/(FFT_SIZE-1))); fft_in[i] = adc_buf[i] * w; } // 调用FFT库(如CMSIS-DSP) arm_rfft_fast_instance_f32 fft_inst; arm_rfft_fast_init_f32(&fft_inst, FFT_SIZE); arm_rfft_fast_f32(&fft_inst, fft_in, fft_out, 0); // 计算幅值 arm_cmplx_mag_f32(fft_out, mag_out, FFT_SIZE/2); }这段代码的关键参数是FFT_SIZE和SAMPLE_RATE。分辨率不够时,要么提高点数,要么降低采样率(但降低采样率会缩小分析带宽)。备赛时要实测不同点数下的计算时间,比如2048点FFT在100MHz主频的MCU上大约需要1ms,那刷新率理论上可以到100Hz,但加上显示和通信,实际可能只有20Hz。答题时要写清楚“本设计在2048点FFT下实现约20Hz刷新率,频率分辨率约49Hz,满足题目要求”。
3.3 参数测量类:频率、幅值、相位差的同步提取
参数测量题通常要求同时测量信号的频率、幅值和相位差。难点在于同步性——三个参数必须来自同一段数据,否则时间差会导致相位差计算错误。答题链路是:ADC同步采样 → 加窗FFT → 峰值搜索 → 相位计算。
频率测量可以用FFT峰值,也可以用过零检测。过零检测在信噪比高时更准,但噪声大时容易误触发。FFT峰值受分辨率限制,但抗噪性好。备赛时建议两种都实现,根据信噪比切换。幅值测量要注意窗函数补偿,不同窗的补偿系数不同。相位差测量要用互谱法:对两路信号分别做FFT,然后计算互谱的相位角。
# 互谱法测相位差 fft1 = np.fft.fft(sig1 * window) fft2 = np.fft.fft(sig2 * window) cross_spectrum = fft1 * np.conj(fft2) phase_diff = np.angle(cross_spectrum[peak_idx]) # 注意:phase_diff是弧度,转成角度要乘以180/pi互谱法的关键是峰值索引要一致。如果两路信号的峰值不在同一个频点,说明信号频率不一致或者分辨率不够。备赛时要先确认两路信号频率相同,再计算相位差。参数上注意:互谱的相位范围是-π到π,如果实际相位差超过这个范围,会出现卷绕,需要根据频率和采样延迟做补偿。
3.4 滤波器设计类:从指标到阶数的快速换算
滤波器设计题通常给出通带截止频率、阻带截止频率、通带波纹和阻带衰减,要求设计并实现。答题链路是:查表确定阶数 → 选择逼近类型 → 计算系数 → 实现结构。
巴特沃斯滤波器最平坦,但过渡带最宽;切比雪夫滤波器过渡带窄,但有波纹;椭圆滤波器过渡带最窄,但通带和阻带都有波纹。备赛时要记住几个典型值:巴特沃斯滤波器,如果阻带衰减要求40dB,过渡比(阻带截止/通带截止)为2,那阶数大约需要4阶;如果过渡比为1.5,阶数就要6阶以上。
提示:比赛时如果算不清阶数,可以直接用滤波器设计软件(如某款在线工具)生成系数,但一定要理解每个参数的含义,否则答辩时会被问住。
实现结构上,二阶节级联最常用,因为系数灵敏度低。每个二阶节的传递函数是:
H(z) = (b0 + b1z^-1 + b2z^-2) / (1 + a1z^-1 + a2z^-2)
备赛时要准备一个二阶节计算模板,输入截止频率和Q值,直接输出系数。这样比赛时改频率只要改Q值,不用重新推导。
3.5 通信类信号题:调制解调与同步
通信类信号题在电赛里属于偏难的方向,通常涉及ASK、FSK或PSK的调制解调。核心考点是载波同步和位同步。载波同步可以用科斯塔斯环或平方环,位同步可以用早迟门或Gardner算法。备赛时如果时间紧,建议先做非相干解调,比如ASK用包络检波,FSK用鉴频器,这样不需要载波同步,实现简单但抗噪性差。
如果题目要求相干解调,那就要做载波恢复。科斯塔斯环的环路滤波器参数很关键:带宽太窄,锁定时间长;带宽太宽,抗噪性差。备赛时要实测不同信噪比下的锁定时间,选一个折中值。位同步的Gardner算法对采样率要求不高,通常每个符号2到4个采样点就够。
答题模板可以写:“本设计采用非相干解调方案,ASK信号通过包络检波和比较器恢复基带,FSK信号通过锁相环鉴频恢复。实测在信噪比10dB时误码率低于10^-3,满足题目要求。”然后附上解调波形和误码率曲线。
4. 易错点:五类失分题与纠正方法
4.1 前端饱和:增益算错导致大信号削顶
错在哪:很多队伍为了测小信号,把增益设得很高,结果输入大信号时运放输出直接饱和,波形削顶,后面算法全错。为什么错:没有做自动增益控制或增益切换。比赛题目通常会给一个动态范围,比如“输入信号幅度1mV到1V”,那固定增益不可能覆盖60dB的范围。怎么答对:备赛时做两级放大,第一级固定增益20dB,第二级用数字电位器或模拟开关切换0/20/40dB。比赛时先用小增益采样,判断幅度后再切大增益。答题时要写“本设计采用两级可切换增益,动态范围覆盖1mV到1V,通过ADC读数自动切换档位”。
4.2 采样率不足:高频信号混叠成低频
错在哪:输入信号含有高频成分,但采样率不够,高频混叠到低频,FFT显示出一个根本不存在的频率。为什么错:没有加抗混叠滤波器,或者滤波器截止频率高于奈奎斯特频率。怎么答对:抗混叠滤波器的截止频率必须小于采样率的一半。如果采样率100kSPS,那滤波器截止频率要低于50kHz,通常设40kHz。备赛时要在ADC前加一个二阶或四阶低通,截止频率根据最大采样率设定。答题时要写“抗混叠滤波器截止频率设为40kHz,确保100kSPS采样下无混叠”。
4.3 FFT泄漏:非整周期采样导致幅值偏低
错在哪:信号频率不是频率分辨率的整数倍,FFT峰值泄漏到相邻频点,测出的幅值比真实值低。为什么错:没有加窗,或者窗函数选错。怎么答对:测幅值用平顶窗,测频率用汉宁窗。如果题目要求同时测幅值和频率,可以用汉宁窗加插值校正。备赛时要实测不同窗下的幅值误差,选一个满足题目精度的。答题时要写“采用平顶窗抑制泄漏,幅值测量误差小于1%”。
4.4 相位差卷绕:超过±180度时符号反转
错在哪:两路信号相位差实际是270度,但互谱法算出来是-90度,符号反了。为什么错:互谱的相位范围是-π到π,超过这个范围会卷绕。怎么答对:根据信号频率和采样延迟做补偿。如果已知信号频率f和两路ADC的采样时间差Δt,那补偿相位为2πfΔt。备赛时要先测出Δt,比赛时直接代入。答题时要写“通过已知延迟补偿,相位差测量范围扩展到0到360度”。
4.5 实时性翻车:算法超时导致输出卡顿
错在哪:FFT点数太多,或者滤波器阶数太高,一帧数据处理时间超过采样间隔,输出波形卡顿。为什么错:没有算清楚时间预算。采样率100kSPS,每帧1024点,那你有10.24ms处理一帧。如果FFT要8ms,滤波要3ms,那就超了。怎么答对:备赛时用定时器实测每个环节的耗时,留出至少30%余量。如果超时,降低点数或换更快的算法(比如用查表法代替实时计算)。答题时要写“本设计一帧处理时间约6ms,满足10ms实时性要求”。
5. 答题节奏:四天三夜的时间分配与押题思路
备赛到最后,拼的不是谁会的多,而是谁失误少。四天三夜的时间分配,我建议按这个节奏走:第一天上午确定方案,下午搭前端和ADC;第二天调算法和参数;第三天联调并测指标;第四天写报告和封箱。听起来很理想,但实际比赛中第一天往往就卡在前端噪声上,所以备选方案必须提前准备。
押题思路上,信号题这几年有个明显趋势:多模块综合。比如“波形发生器+频谱分析”二合一,或者“参数测量+滤波输出”闭环。备赛时不要只练单一题型,要把几个模块串起来做。比如你做了一个DDS波形发生器,就顺手加一个ADC采样和FFT显示,这样比赛时不管题目怎么变,你都有可复用的代码和电路。
注意:比赛时如果题目要求“实时显示”,那你的显示刷新率至少10Hz,否则评委会认为你“卡顿”。备赛时用秒表实测刷新率,不要凭感觉。
我自己的血泪经验是:永远留一版能跑通的简化代码。比赛时如果高级功能调不出来,立刻切回简化版,先保证基础分。比如FFT测频率,简化版可以用过零检测,虽然精度低但一定能跑。等基础分拿到手,再回头调高级算法。从那以后我每次备赛都会强制走一遍“降级流程”:把每个模块的最简实现单独存一个文件,比赛时直接替换。
最后说一个具体方法:用指标反推方案。题目给什么指标,你就反推需要什么器件和算法。比如题目要求“失真度小于1%”,那你就反推DAC位数至少12位,重构滤波器至少四阶,运放压摆率要够。这样一步步推下来,方案自然就清晰了。希望帮到你。
本文还有配套的精品资源,点击获取