主要内容

一种可变大小FFT的HDL实现

这个例子展示了如何使用一个FFT核心来实现一个可变大小的FFT。

这个例子包括两个模型VariableSizeFFTHDLExampleVariableSizeFFTArbitraryValidPatternHDLExample显示不同输入有效模式的可变大小FFT实现。

许多流行的标准,如WLAN、WiMax、数字视频广播(DVB)、数字音频广播(DAB)和长期演进(LTE),提供多种带宽选择。对于这些标准,OFDM调制和解调所需的FFT长度随带宽选择而变化。例如,LTE支持1.4 MHz到2金宝app0 MHz的不同信道带宽选项,这需要FFT长度分别为128到2048。的FFT HDL优化(DSP系统工具箱)块生成特定FFT长度的HDL代码。这个例子演示了如何使用FFT HDL优化块来实现一个可变大小的FFT。

本例在MATLAB®中生成输入数据并导入到Simulink®中进行仿真。金宝app导入的数据通过单个FFT和多个FFT提供给可变大小的FFT实现。为了证明单次fft实现与使用不同大小的多个fft的结果相匹配,我们将Simulink仿真的输出流都导出到MATLAB中进行比较。金宝app

模型架构

两个模型中的顶层子系统都实现了一个可变大小的FFT。上层子系统使用单个FFT块,底层子系统使用多个不同大小的FFT块提供参考数据。

该模型VariableSizeFFTHDLExample可以处理有效样本之间有间隙的数据,只要间隙取决于FFT长度。

modelname =“VariableSizeFFTHDLExample”;open_system (modelname);

FFT长度的配置

FFT长度是通过一个变量指定的fftLenVecMulFFTs.这些长度中最大的存储在一个变量中fftLenSinFFT中FFT块的FFT长度使用单一FFT的可变大小FFT子系统。

输入fftLenIn的FFT长度矢量生成fftLenVecMulFFTs

fftLenVecMulFFTs = [128; 256; 512; 1024; 2048);%可变大小FFT使用的单个FFT长度。fftLenSinFFT = max (fftLenVecMulFFTs);%通过重复|fftLenVecMulFFTs|的每个元素生成| fft列宁|% |fftLenSinFFT|遍历,并在单个列中排列。fftLenSinFFT fflen = repmat (fftLenVecMulFFTs。',1);fftLenIn = uint16 (fflen (:));

输入的一代

dataInvalidIn,fftLenIn输入在MATLAB中生成并导入到Simulink模型中。金宝app随机复输入数据randInputData的每个FFT长度生成fftLenVecMulFFTs.不同的FFT长度对应不同的带宽和不同的采样率。例如,在LTE中,FFT长度为128、256、512、1024、2048时,采样率分别为1.92 MHz、3.84 MHz、7.68 MHz、15.36 MHz、30.72 MHz。任何FFT长度的符号时间为\μs $ 66.67美元.该示例在指定的FFT长度中以最高速率运行。

dataIn信号是由在之间填充零产生的randInputData样本。下图显示了输入数据和有效模式fftLenVecMulFFTs256 512和fftLenSinFFT在2048年。对于256的FFT长度,示例为每个有效样本插入7个无效样本;对于512的FFT长度,代码为每个有效样本插入3个无效样本。

该模型VariableSizeFFTHDLExample要求输入的有效模式在有效样本之间有一个间隙,如下图所示。

rng (“默认”);dataIn = 0(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);validIn = false(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);%循环FFT长度印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));输入数据样本之间的填充为零upSamplingFac = fftLenSinFFT / fftLenVecMulFFTs(印第安纳州);dataIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (randInputData upSamplingFac);%有效,对应生成的数据tempValid = true (fftLenVecMulFFTs(印第安纳州));validIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (tempValid upSamplingFac);结束inputDataType =“fixdt(14) 1, 16日”%此处可修改输入数据类型set_param (“VariableSizeFFTHDLExample /数据类型转换”“OutDataTypeStr”, inputDataType);获取FFT延迟fftObj = dsp。HDLFFT (“FFTLength”fftLenSinFFT,...“架构”“流基数2 ^ 2”...“ComplexMultiplication”使用3个乘法器和5个加法器...“BitReversedOutput”假的,...“BitReversedInput”假的,...“正常化”、假);延迟= getLatency (fftObj);%默认延迟为4137 2048点FFT。additionPipelineDelay = 6;%额外的管道延迟数% 金宝appSimulink仿真结束时间Total Latency = FFT时延+%数据控制器(5个时钟周期)。%模拟运行总时间= Total%输入样本数+总延迟+管道延迟。simTime = fftLenSinFFT*(length(fftLenVecMulFFTs) + 1) + latency + additionPipelineDelay;

可变大小的FFT使用单一FFT

使用单一FFT的可变大小FFT设计包括数据控制器、FFT HDL优化模块和Bin选择子系统。

open_system ([modelname'/可变大小FFT使用单一FFT']);

数据控制器子系统控制输入数据,以便FFT HDL优化块的输入数据样本之间填充0。FFT HDL Optimized block配置FFT长度为2048,这是LTE标准所要求的最大FFT长度。为了简化输出箱的选择,FFT块被配置为按位自然顺序输出样本。FFT长度通过输入端口指定,并在帧的开始处进行采样。请求的FFT长度必须被延迟以匹配FFT延迟。FFT长度是使用FFT的开始输出信号和产生的帧信号结束注册。这种方法避免了实现大的延迟匹配内存。由于输入数据在样本之间有零,大FFT的输出包含FFT长度样本的重复副本。为了得到所需的FFT输出,从FFT输出中采集第一个FFT长度样本。这个操作是通过修改FFT的输出有效信号使用本的选择子系统。

多种fft供参考

该分系统被用作参考,与使用单FFT的可变大小FFT的输出进行比较。该子系统包括5个不同的FFT块(FFT 128, FFT 256, FFT 512, FFT 1024, FFT 2048)和一个MATLAB函数块。输入数据将被提供给所有五个fft。根据所请求的FFT长度,激活5个FFT块中的一个并执行FFT操作。MATLAB函数块pickFFTData从适当的FFT块中选择输出。输出保存到MATLAB中,与使用单FFT的可变大小FFT的输出进行比较。

open_system ([modelname“/多个fft供参考”]);

运行仿真金宝app软件模型

MATLAB脚本配置所需的FFT长度矢量,单个FFT的大小,并生成有效信号的输入数据。然后运行该模型,并在MATLAB中比较两个子系统的输出。

使用。运行模型sim卡命令的MATLAB命令行。

sim (modelname);

验证

两个子系统的输出被发送到MATLAB工作空间,并绘制出差异。在这种情况下,两个子系统的输出是相同的,两组值之间的误差是0。

dataOut1 =着干活(:);dataOut2 = out2 (:);figVSF =图(“可见”“关闭”);情节(abs (dataOut1-dataOut2));标题(固定有效模式的两个输出之间的差异)包含(“样本指数”);ylabel (“错误”);figVSF。可见=“上”;bdclose (modelname);

金宝app支持任意输入有效模式

上述模型VariableSizeFFTHDLExample要求输入数据样本之间有最小的间隔。间隙取决于指定的FFT长度和设计处理的最大FFT长度。在某些情况下,输入数据可能不符合此模式。例如,数据可能是连续的,并在输入数据样本的末尾填充0。下图显示了一个连续的有效输入模式,在FFT长度为256和512的输入数据样本的末尾填充无效样本。单个FFT长度设置为2048。在这种情况下,在256个有效样本之后是1792个无效样本,在512个有效样本之后是1536个无效样本。

在这种情况下,设计必须将输入样本存储到RAM中,并在有效样本之间填充无效样本,然后将其发送到FFT。该模型VariableSizeFFTArbitraryValidPatternHDLExample可以处理任何有效输入的任意模式,只要帧之间的间隙至少是单个FFT长度(LTE为2048个样本)。这个型号和那个型号一样VariableSizeFFTHDLExample,数据控制器子系统除外。模型中的数据控制器子系统使用大小相同的RAM2 * fftLenSinFFT(如下图所示)来存储输入样本,读取有效样本,并在它们之间填充0,然后将它们传递给FFT。当输入数据被写入内存的一半时,数据从内存的另一半读取。因此,总延迟增加了fftLenSinFFT

modelname =“VariableSizeFFTArbitraryValidPatternHDLExample”;load_system (modelname);open_system ([modelname/变量大小FFT使用单一FFT/数据控制器]);

任意输入数据和有效生成

为了生成任意数据和有效输入,用户可以选择这三个选项中的任何一个:数据样本之间固定大小的零填充,数据样本结束时的零填充,以及数据样本之间随机大小的零填充。这三种不同的零填充模式的输入数据和有效生成如下所示。的VariableSizeFFTArbitraryValidPatternHDLExample模型使用生成的数据进行仿真和验证。

%初始化输入数据和有效dataIn = 0(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);validIn = false(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);zeroPaddingPattern =中间画的%’AtEnd”、“随机”开关zeroPaddingPattern情况下中间画的输入数据样本之间的填充为零印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));输入数据样本之间的填充为零upSamplingFac = fftLenSinFFT / fftLenVecMulFFTs(印第安纳州);dataIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (randInputData upSamplingFac);%有效,对应生成的数据validIn ((ind-1) * fftLenSinFFT + 1: upSamplingFac: fftLenSinFFT *印第安纳州)= true;结束情况下“AtEnd”在输入数据样本的末尾填充0印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));填充零数据dataIn (((ind-1) * fftLenSinFFT + 1): ((ind-1) * fftLenSinFFT + fftLenVecMulFFTs(印第安纳州)))= randInputData;%有效对应生成的数据validIn (((ind-1) * fftLenSinFFT + 1): ((ind-1) * fftLenSinFFT + fftLenVecMulFFTs(印第安纳州)))= true;结束否则%随机印第安纳州= 1:长度(fftLenVecMulFFTs)%零填充随机randIndices = randperm (fftLenSinFFT);%生成FFT长度样本数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));指数= randIndices (1: fftLenVecMulFFTs(印第安纳州));%如果随机指数没有第一个样本如果(sum(indices==1)==0) indices(1) =1;结束填充零数据dataIn(指数+ (ind-1) * fftLenSinFFT) = randInputData;%有效对应生成的数据validIn(指数+ (ind-1) * fftLenSinFFT) = true;结束结束

运行Simuli金宝appnk模型

在运行模型之前,请确保dataInvalidInfftLenIn,并初始化必要的变量。

sim (modelname);

验证

dataOut1 =着干活(:);dataOut2 = out2 (:);figVSFAIV =图(“可见”“关闭”);情节(abs (dataOut1-dataOut2));标题(“任意有效模式的两个输出之间的差异”)包含(“样本指数”);ylabel (“错误”);figVSFAIV。可见=“上”;bdclose (modelname);

HDL代码生成与验证

要生成本例中引用的HDL代码,需要一个HDL Coder™许可证。

您可以使用这些命令makehdlmakehdltb为子系统生成HDL代码和测试台。

为可变大小FFT子系统生成的HDL代码为Xilinx®Zynq®-7000 ZC706板合成。合成结果如下表所示。

上表显示,使用单个FFT实现可变大小的FFT比使用多个FFT解决方案使用更少的硬件资源。为了支金宝app持任意输入的有效模式,硬件实现使用了更多的RAM。

另请参阅

(DSP系统工具箱)