主要内容

可变大小FFT的HDL实现

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

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

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

此示例在MATLAB®中生成输入数据,并将其导入Simulink®进行仿真。导入的数据通过使用单个FFT和多个FFT馈送到可变万博1manbetx大小FFT的实现。为了证明单个FFT实现与使用多个不同大小FFT的结果相匹配,来自Sim卡的两个输出流将ulink仿真导出到MATLAB中进行比较。

模型架构

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

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

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

输入的一代

dataIn瓦利丁fftLenIn输入在MATLAB中生成并导入Simulink模型。随机复杂输入数据万博1manbetxrandInputData的每个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=complex(randn(1,fftLenveCmulfts(ind)),randn(1,fftLenveCmulfts(ind));%输入数据样本之间的零填充上采样fac=fftLenSinFFT/fftlensincmulfts(ind);数据输入((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind)=上采样(随机输入数据,上采样fac);%有效,对应生成的数据tempValid = true (fftLenVecMulFFTs(印第安纳州));validIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (tempValid upSamplingFac);结束inputDataType =“fixdt(14) 1, 16日”%此处可修改输入数据类型设置参数('VariableSizeFFTHDLExample/数据类型转换'“OutDataTypeStr”, inputDataType);%获取FFT延迟fftObj = dsp。HDLFFT (“FFTLength”fftLenSinFFT,...“建筑”'流式基数2^2'...“ComplexMultiplication”使用3个乘法器和5个加法器...“位反转输出”错误的...“BitReversedInput”错误的...“正常化”、假);延迟= getLatency (fftObj);%2048点FFT的默认延迟为4137。additionPipelineDelay = 6;%额外的管道延迟数% 万博1manbetxSimulink仿真结束时间Total Latency = FFT时延+%数据控制器(5个时钟周期)。%模拟运行总时间= Total%输入样本数+总延迟+管道延迟。simTime=fftLenSinFFT*(长度(fftLenVecMulFFTs)+1)+延迟+附加管道延迟;

可变大小的FFT使用单一FFT

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

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的输出进行比较。该子系统包括五个不同的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万博1manbetxmulink模型

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

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

sim(型号名称);

验证

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

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

万博1manbetx支持任意输入有效模式

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

在这种情况下,设计必须将输入样本存储到RAM中,并在将其发送到FFT之前在有效样本之间填充无效样本VariableSizeFFTArbitraryValidPatternHDLExample可以处理任何有效输入的任意模式,只要帧之间的间隙至少是单个FFT长度(LTE为2048个样本)。这个型号和那个型号一样VariableSizeFFTHDLExample,但数据控制器子系统除外。模型中的数据控制器子系统使用大小为的RAM2*fftLenSinFFT(如下图所示)为了存储输入样本,读取有效样本,同时在它们之间填充零,然后将它们传递给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”,“Random”转换零填充模式情况下中间画的%输入数据样本之间的零填充印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本数据randInputData=complex(randn(1,fftLenveCmulfts(ind)),randn(1,fftLenveCmulfts(ind));%输入数据样本之间的零填充上采样fac=fftLenSinFFT/fftlensincmulfts(ind);数据输入((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind)=上采样(随机输入数据,上采样fac);%有效,对应生成的数据validIn ((ind-1) * fftLenSinFFT + 1: upSamplingFac: fftLenSinFFT *印第安纳州)= true;结束情况下“AtEnd”在输入数据样本的末尾填充0印第安纳州= 1:长度(fftLenVecMulFFTs)%生成FFT长度样本数据randInputData=complex(randn(1,fftLenveCmulfts(ind)),randn(1,fftLenveCmulfts(ind));填充零数据数据输入((ind-1)*fftLenSinFFT+1):((ind-1)*fftLenSinFFT+fftLenVecMulFFTs(ind))=随机输入数据;%与生成的数据对应的有效数据validIn (((ind-1) * fftLenSinFFT + 1): ((ind-1) * fftLenSinFFT + fftLenVecMulFFTs(印第安纳州)))= true;结束否则%随机印第安纳州= 1:长度(fftLenVecMulFFTs)%零填充随机randIndices = randperm (fftLenSinFFT);%生成FFT长度样本数据randInputData=complex(randn(1,fftLenveCmulfts(ind)),randn(1,fftLenveCmulfts(ind));Index=RandIndex(1:fftLenveCmulfts(ind));%如果随机指数没有第一个样本如果(sum(indices==1)==0) indices(1) =1;结束填充零数据dataIn(指数+ (ind-1) * fftLenSinFFT) = randInputData;%与生成的数据对应的有效数据validIn(指数+(ind-1)*fftLenSinFFT)=真;结束结束

运行Simuli万博1manbetxnk模型

在运行模型之前,请确保dataIn瓦利丁fftLenIn,并初始化必要的变量。

sim(型号名称);

验证

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

HDL代码生成与验证

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

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

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

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

另请参阅

(DSP系统工具箱)