主要内容

HDL实现可变尺寸的FFT

此示例显示如何使用单个FFT核心实现可变大小的FFT。

这个例子包括两个模型variableizebewthdlexample.VariableSizeFFTArbitraryValidPatternHDLExample为不同输入有效模式显示可变尺寸的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块提供参考数据。

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

modelname ='variableizeboufthdlexample';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 (:));

输入的一代

dataInvidmin, 和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长度,示例为每个有效样本和FFT长度为512的示例插入7个无效样本,代码为每个有效示例插入3个无效样本。

该模型variableizebewthdlexample.需要输入有效模式在有效样本之间具有间隙,如下图所示。

RNG(“默认”);dataIn = 0(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);有效= false(长度(fftlenvecmulffts)* fftlensinfft,1);%循环超过FFT长度为了印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本的数据randInputData =络合物(randn(1,fftLenVecMulFFTs(IND)),randn(1,fftLenVecMulFFTs(IND)));输入数据样本之间的%零填充UpsamplingFac = FFTLensinfft / FFTLenvecMulffts(IND);数据((IND-1)* FFTLENSINFFT + 1:FFTLENSINFFT * IND)= UPSAMPLE(RANDINPUTDATA,UPSAMPLINGFAC);%有效,对应生成的数据tempValid = true (fftLenVecMulFFTs(印第安纳州));validIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (tempValid upSamplingFac);结尾InputDatatype =.'fixdt(1,16,14)'可以在此修改%输入数据类型set_param('VariaBlileIzebthdlexample /数据类型转换''outdataTypestr', inputDataType);%得到FFT延迟fftObj = dsp。HDLFFT ('fftlength'fftLenSinFFT,...'建筑学''流媒体基数2 ^ 2'...'ComplexMultiplication'使用3个乘法器和5个加法器...'bitreversedoutput',错误的,...“BitReversedInput”,错误的,...“正常化”,错误的);延迟= getLatency(fftobj);2048点FFT的%默认延迟为4137。additionPipelineDelay = 6;百分比额外的管道延迟% 金宝appSimulink仿真结束时间Total Latency = FFT时延+%数据控制器(5个时钟周期)。%模拟运行总时间= Total%输入样本数+总延迟+管道延迟。SIMTIME = FFTLENSINFFT *(长度(FFTLENVECMULFFTS)+ 1)+延迟+添加剂;

使用单个FFT的可变尺寸FFT

“使用单个FFT的可变尺寸FFT”设计包括数据控制器,FFT HDL优化块和箱选择子系统。

open_system ([modelname'/可变尺寸FFT使用单个FFT']);

数据控制器子系统控制输入数据,使输入到FFT HDL优化块的输入具有Zeros填充它们的数据样本。FFT HDL优化块配置为FFT长度为2048,LTE标准所需的最大FFT长度。为了简化输出箱的选择,FFT块被配置为以比特自然顺序输出样本。FFT长度通过输入端口指定,并在帧的开始处进行采样。必须延迟请求的FFT长度以匹配FFT延迟。使用FFT的启动输出信号和帧信号的生成端登记FFT长度。该方法避免实现大延迟匹配的存储器。由于输入数据在样本之间具有零,因此大FFT的输出包含FFT长度样本的重复副本。为了获得所需的FFT输出,从FFT输出收集第一FFT长度样本。通过使用FFT的输出有效信号使用FFT的输出有效信号来执行此操作宾馆选择子系统。

用于参考的多个FFT

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

open_system ([modelname'/多个FFT参考']);

运行Si金宝appmulink模型

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

使用。运行模型SIM命令的MATLAB命令行。

sim(modelname);

确认

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

dataOut1 =着干活(:);dataOut2 = out2 (:);figVSF =图('可见的''离开');情节(abs (dataOut1-dataOut2));标题(固定有效模式的两个输出之间的差异)Xlabel('样本索引');ylabel ('错误');figVSF。可见='在';bdclose(modelname);

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

上述模型variableizebewthdlexample.需要在输入数据样本之间具有最小差距。间隙取决于指定的FFT长度和设计由设计处理的最大FFT长度。可能存在输入数据可能不符合此模式的情况。例如,数据可以在输入数据样本的末尾与零是连续的并且填充。下图显示了与FFT长度的输入数据样本结束时填充的连续输入有效模式,用于FFT长度为256和512.单个FFT长度设置为2048.在这种情况下,256个有效的样本后跟1792无效样品和512个有效样本后跟1536无效样品。

在这种情况下,设计必须将输入样本存储到RAM中,并在将其发送到FFT之前在有效样本之间焊接无效的样本。该模型VariableSizeFFTArbitraryValidPatternHDLExample只要帧之间的间隙至少是单个FFT长度(用于LTE的2048个样本),可以处理任何任意的有效输入模式。该模型与模型相同variableizebewthdlexample.,除数据控制器子系统外。模型中的数据控制器子系统使用大小的RAM2 * fftlensinfft.(如下图所示)要存储输入样本,请在填充它们之间的填充零时读出有效样本,然后将它们传递给FFT。虽然输入数据被写入存储器的一半,但是从存储器的另一半读取数据。结果,总延迟增加Fftlensinfft

modelname =“VariableSizeFFTArbitraryValidPatternHDLExample”;load_system (modelname);open_system ([modelname'/可变尺寸FFT使用单个FFT / Data Controller']);

任意输入数据和有效生成

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

输入数据的初始化和有效dataIn = 0(长度(fftLenVecMulFFTs) * fftLenSinFFT, 1);有效= false(长度(fftlenvecmulffts)* fftlensinfft,1);ZeropadddingPattern =.中间画的%'ateen','随机'转变ZeropaddingPattern.案件中间画的输入数据样本之间的%零填充为了印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本的数据randInputData =络合物(randn(1,fftLenVecMulFFTs(IND)),randn(1,fftLenVecMulFFTs(IND)));输入数据样本之间的%零填充UpsamplingFac = FFTLensinfft / FFTLenvecMulffts(IND);数据((IND-1)* FFTLENSINFFT + 1:FFTLENSINFFT * IND)= UPSAMPLE(RANDINPUTDATA,UPSAMPLINGFAC);%有效,对应生成的数据validIn ((ind-1) * fftLenSinFFT + 1: upSamplingFac: fftLenSinFFT *印第安纳州)= true;结尾案件“AtEnd”在输入数据样本的末尾填充0为了印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本的数据randInputData =络合物(randn(1,fftLenVecMulFFTs(IND)),randn(1,fftLenVecMulFFTs(IND)));填充零数据数据(((IND-1)* FFTLENSINFFT + 1):((IND-1)* FFTLENSINFFT + FFTLENVECMULFFTS(IND)))= RANDINPUTDATA;对应生成的数据的%有效vidinin(((ind-1)* fftlensinfft + 1):((ind-1)* fftlensinfft + fftlenvecmulffts(ind)))= true;结尾除此以外% 随机的为了印第安纳州= 1:长度(fftLenVecMulFFTs)%零填充随机randIndices = randperm (fftLenSinFFT);%生成FFT长度样本的数据randInputData =络合物(randn(1,fftLenVecMulFFTs(IND)),randn(1,fftLenVecMulFFTs(IND)));索引= RANDINDICES(1:FFTLENVECMULFFTS(IND));%如果随机索引没有第一个样本如果(sum(indices==1)==0) indices(1) =1;结尾填充零数据dataIn(指数+ (ind-1) * fftLenSinFFT) = randInputData;对应生成的数据的%有效vidinin(索引+(ind-1)* fftlensinfft)= true;结尾结尾

运行Simuli金宝appnk模型

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

sim(modelname);

确认

dataOut1 =着干活(:);dataOut2 = out2 (:);figvsfaiv = figure('可见的''离开');情节(abs (dataOut1-dataOut2));标题(“任意有效模式的两个输出之间的差异”)Xlabel('样本索引');ylabel ('错误');figVSFAIV。可见='在';bdclose(modelname);

HDL代码生成和验证

要生成此示例中引用的HDL代码,则需要HDL Coder™许可证。

您可以使用命令makehdl.makehdltb.生成HDL代码和子系统的测试台。

为Xilinx®Zynq®-7000 ZC706板合成了为变量大小FFT子系统生成的HDL代码。合成结果显示在下表中。

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

另请参阅

(DSP系统工具箱)