高速DVB_T接收系统2k_8k FFT处理器设计与ROM优化

需积分: 9 2 下载量 54 浏览量 更新于2024-09-20 收藏 207KB PDF 举报
本文主要探讨了DVB_T接收系统中的2k和8k快速傅立叶变换(FFT)处理器的设计及其ROM优化策略。DVB_T(Digital Video Broadcasting - Terrestrial)是地面数字电视广播标准,对实时性和高速性能有着严格的要求,因此设计一个高效能的FFT处理器至关重要。 设计的核心是一种多级同步流水线结构,这种结构利用了SRAM(静态随机存取存储器)作为主要的存储元件,结合了SDF(Single-Path Delay Feedback)和DIF(Direct Interleaved Format)等技术来提高运算效率。这种设计将复杂的2k和8k FFT分解为五个或六个基于基数4的蝶形运算单元的级联,以及一个基数2的蝶形单元,通过级联方式减少了运算的复杂度和延迟,从而提升了处理速度。 在硬件实现方面,整个FFT处理器被划分为多个模块,所有电路逻辑使用Verilog HDL硬件描述语言进行描述,确保了代码的可读性和可维护性。此外,作者还进行了功能一致性仿真验证,确保设计在实际应用中的正确性,之后进行了RTL( Register Transfer Level)综合,转化为实际的硬件实现。 值得注意的是,作者对存储旋转因子的ROM(Read-Only Memory)进行了优化处理。旋转因子在FFT算法中扮演重要角色,但过多的存储空间可能会占用不必要的硬件资源。通过精心设计,文章提出了一个有效的方法来最小化ROM的面积,同时保持足够的计算性能,这对于资源受限的嵌入式系统来说尤其关键。 本文的研究成果对于DVB_T接收系统的性能提升具有重要意义,特别是在处理视频信号和音频编码等实时应用时,优化后的FFT处理器可以显著提高数据处理速度,降低功耗,满足现代通信系统对高速、低延迟的要求。这篇文章提供了深入理解高速实时FFT处理器设计以及如何在实际系统中有效利用硬件资源的方法,对相关领域的工程师和技术人员具有很高的参考价值。

#include "arduinoFFT.h" arduinoFFT FFT = arduinoFFT(); const uint16_t samples = 64; const double signalFrequency = 1000; const double samplingFrequency = 5000; const uint8_t amplitude = 100; double vReal[samples]; double vImag[samples]; #define SCL_INDEX 0x00 #define SCL_TIME 0x01 #define SCL_FREQUENCY 0x02 #define SCL_PLOT 0x03 void setup() { Serial.begin(115200); while(!Serial); Serial.println("Ready"); } void loop() { double cycles = (((samples-1) * signalFrequency) / samplingFrequency); for (uint16_t i = 0; i < samples; i++) { vReal[i] = int8_t((amplitude * (sin((i * (twoPi * cycles)) / samples))) / 2.0); vImag[i] = 0.0; } Serial.println("Data:"); PrintVector(vReal, samples, SCL_TIME); FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /* Weigh data */ Serial.println("Weighed data:"); PrintVector(vReal, samples, SCL_TIME); FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */ Serial.println("Computed Real values:"); PrintVector(vReal, samples, SCL_INDEX); Serial.println("Computed Imaginary values:"); PrintVector(vImag, samples, SCL_INDEX); FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */ Serial.println("Computed magnitudes:"); PrintVector(vReal, (samples >> 1), SCL_FREQUENCY); double x; double v; FFT.MajorPeak(vReal, samples, samplingFrequency, &x, &v); Serial.print(x, 6); Serial.print(", "); Serial.println(v, 6); while(1); } void PrintVector(double *vData, uint16_t bufferSize, uint8_t scaleType) { for (uint16_t i = 0; i < bufferSize; i++) { double abscissa; switch (scaleType) { case SCL_INDEX: abscissa = (i * 1.0); break; case SCL_TIME: abscissa = ((i * 1.0) / samplingFrequency); break; case SCL_FREQUENCY: abscissa = ((i * 1.0 * samplingFrequency) / samples); break; } Serial.print(abscissa, 6); if(scaleType==SCL_FREQUENCY) Serial.print("Hz"); Serial.print(" "); Serial.println(vData[i], 4); } Serial.println(); } 根据此历程中fft转换的方法修改oled代码

2023-07-16 上传