跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

2023 电赛 H 题:基于 FPGA 与 STM32 的信号分离装置设计

针对 2023 年电赛 H 题信号分离需求,方案采用 FPGA 采集数据并通过串口传输至 STM32 进行 FFT 频谱分析,识别波形类型及频率后反馈给 FPGA 重构信号。核心难点在于解决时钟不同步导致的相位漂移,通过数字锁相环(DPLL)实现输出与原信号的相位锁定。系统包含高速 ADC 采样、FIFO 跨时钟域传输、DSP 库 FFT 运算、DDS 波形生成及移相控制模块,最终经 DAC 输出分离后的两路波形。

云间运维发布于 2026/4/11更新于 2026/9/1054 浏览
2023 电赛 H 题:基于 FPGA 与 STM32 的信号分离装置设计

前言

本次方案除增益为 1 的加法器部分外,核心处理逻辑均由 FPGA 配合 STM32 完成。主要目标是输入混合信号 C,从中解调出原始的两路波形 A'和 B'。

题目背景

题目要求从信号发生器输出两路波形 A 和 B,通过加法器生成信号 C。我们需要做的就是从 C 中将 A'和 B'解出来。常见的思路是对 C 进行傅里叶变换识别成分后分离,但考虑到重构波形与原信号时钟不同步会导致相位漂移,本方案采用了锁相环技术来锁定相位。

系统架构

数据流向如下: C 信号 → 高速 ADC → FPGA → FIFO → 串口 → STM32 → FFT 分析 → 识别波形/频率 → 串口 → DDS 重构 → 锁相环 → 高速 DAC → A',B'

核心模块实现

1. 数据采集与传输(FPGA)

这部分主要解决跨时钟域问题。ADC 采样率为 1MHz,而串口发送速率仅为 12.5KHz,中间必须使用 FIFO 缓冲。

FIFO 控制逻辑 写入侧跟随 ADC 时钟(1MHz),读取侧跟随串口波特率分频后的时钟。状态机控制读写使能,防止溢出或下溢。

assign ad9238_clk_ch0 = clk_1M;
wire wr_en, rd_en, full, empty;
reg [7:0] w_data;
localparam W_IDLE = 1, W_FIFO = 2;
reg[2:0] write_state, next_write_state;

always@(posedge clk_1M or negedge rst) begin
    if(rst == 1'b0) write_state <= W_IDLE;
    else write_state <= next_write_state;
end

always@(*) begin
    case(write_state)
        W_IDLE: if(empty == 1'b1) next_write_state <= W_FIFO; else next_write_state <= W_IDLE;
        W_FIFO: if(full == 1'b1) next_write_state <= W_IDLE; else next_write_state <= W_FIFO;
        default: next_write_state <= W_IDLE;
    endcase
end

assign wr_en = (next_write_state == W_FIFO) ? 1'b1 : 1'b0;
// ... 后续 FIFO 实例化代码 ...

串口通信 FPGA 端负责将采集到的数据打包发送,并接收 STM32 返回的分析结果。帧头设为 0xFF,帧尾 0xFE,中间包含波形类型和频率信息。

注意:实际工程中 tx_vilid 拼写有误,应修正为 tx_valid,这里保留原意但建议统一命名规范。

2. 信号分析与识别(STM32)

STM32 通过串口中断接收数据,利用 DSP 库进行 FFT 运算。由于题目不要求峰峰值完全一致,我们主要关注频谱特征。

FFT 处理流程

  1. 确定频率范围 20KHz-100KHz,步进 5KHz。
  2. 计算各频段能量,找出能量最大的两个点作为主波频率。
  3. 根据基波幅值判断波形:正弦波单音集中,三角波含三次谐波导致基波削弱。设定阈值区分正弦波与三角波。
// FFT 能量聚集与峰值查找
for (int i=35; i<1000; i++) {
    freq = (int)(((float)i*1000000/2048/5000)+0.5);
    if(freq==freq_last) {
        v_max = FFT_output[i]*FFT_output[i]+v_max;
    } else {
        v_max = sqrt(v_max);
        freq_change[cnt] = v_max;
        fre[cnt] = freq;
        freq_last=freq;
        cnt++;
    }
}
// 筛选最大两个能量点
for(int i=0; i<100; i++) {
    if(freq_change[i]>max[0]) { /* 更新最大值 */ }
    else if(freq_change[i]>max[1] && freq_change[i]<max[0]) { /* 更新次大值 */ }
}
// 判定波形类型
if(max[0]>5.7) wave[0] = 0; // 正弦波
else wave[0] = 1; // 三角波

串口回传 根据识别结果,按协议格式打包波形类型和频率索引,发回 FPGA。

3. 波形重构与锁相(FPGA)

收到反馈后,FPGA 内部启动 DDS 模块重构波形。这里有个关键问题:重构时钟与源信号时钟存在微小差异,长期运行会产生相位漂移,因此必须引入锁相环。

DDS 模块 使用 ROM 存储正弦和三角波表,通过相位累加器寻址。支持动态调整频率和相位。

数字锁相环(DPLL) 鉴相环节将输入信号与输出信号相乘并通过低通滤波器得到误差电压,经 PI 调节后反馈给 DDS 的相位寄存器,实现相位同步。

mult_mix mult_mix_A (.A(ADC_signed), .B(DAC_A), .P(mix_A));
LPF LPF_A (.s_axis_data_tdata(A_filter), .m_axis_data_tdata(A_filter_out));
Loop_filter Loop_filter_A(.i_pd(A_filter_out), .o_frequency_df(A_phase));

4. 人机交互与输出

移相控制 通过按键设置相位差,数码管实时显示当前相位值。按键需做消抖处理,避免误触发。

DAC 输出 最终数据送入高速 DAC 转换为模拟信号输出。注意 DAC 数据需进行偏移处理以匹配双极性输出范围。

总结

整个系统通过软硬件协同,实现了信号的实时分离与重构。关键点在于跨时钟域的数据传输稳定性、FFT 算法的精度以及锁相环参数的整定。实际调试中,环路滤波器的 Kp 和 Ki 参数需要反复微调,确保波形无抖动且跟踪迅速。

目录

  1. 前言
  2. 题目背景
  3. 系统架构
  4. 核心模块实现
  5. 1. 数据采集与传输(FPGA)
  6. 2. 信号分析与识别(STM32)
  7. 3. 波形重构与锁相(FPGA)
  8. 4. 人机交互与输出
  9. 总结

更多推荐文章

查看全部
  • C++11 核心特性详解:初始化、移动语义与 Lambda 表达式
  • 物联网固件 Web 管理接口漏洞挖掘与命令注入实战
  • 使用码云 Gitee 登录 Ruoyi-Vue-Pro 配置指南
  • SystemVerilog 教程:从基础概念到高级验证
  • Ubuntu 24.04 安装 NVIDIA Container Toolkit 配置 Docker GPU 加速
  • Python+AI 智能害虫识别助手搭建实战
  • EvoMap:基于基因胶囊与生物逻辑的 AI 智能体进化方案
  • Midjourney 进阶:色相详解
  • 前端 AI 与营销增长领域的 AI 应用核心趋势
  • 使用 wechat-need-web 插件实现在浏览器中访问微信网页版
  • Docker 运行 hello-world 镜像失败或超时问题排查
  • Python 零基础学习经验总结与入门技术指南
  • 37 个 Python Web 开发框架整理与选型指南
  • OpenClaw 接入飞书实战:10 分钟实现 AI 自动操作文档与表格
  • Git 分支管理与代码合并规范(master/dev 场景)
  • GitHub 学生开发者包主要福利介绍
  • Stable Diffusion 入门:提示词编写与 ControlNet 实战指南
  • 在Windows上离线部署OpenClaw与Ollama
  • OpenClaw ACP 协议深度解析:让 IDE 直接驱动你的 AI Agent
  • 无经验如何转型为 AI 产品经理

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online