紫光FPGA设计:双通道HDMI控制显示屏实现音频信号FFT频谱图像 双通道频谱显示
紫光FPGA设计双通道HDMI控制显示屏实现音频信号FFT频谱图像 双通道频谱显示支持显示音频处理前的音频频谱和音频处理后的音频频谱实现处理前后频谱效果可视化对比图片仅为效果演示音频处理需自行实现。最近在紫光FPGA上折腾了个有意思的项目——通过双通道HDMI实时显示音频频谱。这玩意儿说白了就是让原始音频和经过处理的音频频谱同时怼到屏幕上方便直接对比处理前后的效果差异。先上张实物图镇楼假装这里有图下面聊聊实现过程中的几个关键点。硬件架构这块主要分三块肉音频采集、FFT处理和HDMI显示。特别要说的是HDMI控制器部分得同时驱动两个独立视频流。这里用了紫光FPGA的PLL生成74.25MHz像素时钟对应1080p的60Hz刷新率。代码里最带劲的是这个时序控制状态机always(posedge pix_clk) begin if(h_count H_TOTAL-1) begin h_count 0; v_count (v_count V_TOTAL-1) ? 0 : v_count 1; end else begin h_count h_count 1; end hsync (h_count H_SYNC_START h_count H_SYNC_END); vsync (v_count V_SYNC_START v_count V_SYNC_END); data_enable (h_count H_DISP v_count V_DISP); end这段代码用计数器实现行场同步信号生成dataenable信号控制有效显示区域。调试时被这个状态机坑过——有次忘记复位vcount导致图像下半截直接飞了排查了半天才发现是计数器溢出问题。频谱生成部分用了基4的FFT流水线结构重点优化了蝶形运算单元。这里有个取巧的做法把旋转因子预存在Block RAM里用相位累加器直接查表。实测在150MHz时钟下能稳定处理48kHz采样的音频数据。紫光FPGA设计双通道HDMI控制显示屏实现音频信号FFT频谱图像 双通道频谱显示支持显示音频处理前的音频频谱和音频处理后的音频频谱实现处理前后频谱效果可视化对比图片仅为效果演示音频处理需自行实现。双通道显示的核心在于视频合成策略。我采用了乒乓操作配合行缓存左边640x480显示原始频谱右边放处理后的。关键代码是这个像素映射逻辑assign pixel_out (hpos 640) ? ram_left[hpos] : ram_right[hpos-640];简单粗暴但有效实际使用时要考虑缓存同步问题。有次测试时左右频谱出现错位最后发现是左右通道的FIFO深度没配平导致的相位差。调试时最头疼的是频谱闪烁问题。后来发现是FFT窗函数没应用导致的频谱泄露加上个汉宁窗立马见效// 在C模型里验证的窗函数代码 for(int i0; iFFT_SIZE; i){ window[i] 0.5 * (1 - cos(2*PI*i/(FFT_SIZE-1))); }移植到FPGA时改成了定点数运算用Q15格式保存系数节省了不少逻辑资源。整个项目摸鱼时间大概用了两周最大的收获是意识到显示时序对齐比算法本身更费劲。目前还存在频谱刷新率与视频帧率不同步时的撕裂现象后续打算上双缓冲机制来解决。代码仓库已经开源在Gitee假装有链接欢迎来拍砖。注音频处理算法需要根据实际需求自行实现本工程仅提供显示框架