主要内容

变尺寸FFT的HDL实现

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

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

许多流行的标准,如WLAN、WiMax、数字视频广播(DVB)、数字音频广播(DAB)和长期演进(LTE),都提供了多种带宽选项。这些标准的OFDM调制和解调所需的FFT长度随带宽选项而变化。例如,LTE支持从1.4 MHz到金宝app20 MHz的不同信道带宽选项,这分别要求FFT长度为128到2048。的FFT(DSP HDL工具箱)块生成特定FFT长度的HDL代码。这个例子演示了如何使用FFT块来实现一个可变大小的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| by生成|fftLenIn|% |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长度的符号时间为$66.67 \mu $.该示例在指定的FFT长度中以最高速率运行。

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

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

rng (“默认”);dataIn = 0(长度(fftLenVecMulFFTs)*fftLenSinFFT,1);validIn = false(长度(fftLenVecMulFFTs)*fftLenSinFFT,1);遍历FFT长度ind = 1:length(fftLenVecMulFFTs)生成FFT长度样本数据randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind)));输入数据样本之间为零填充upSamplingFac = fftLenSinFFT/fftLenVecMulFFTs(ind);dataIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = upsample(randInputData,upSamplingFac);%有效,对应生成的数据tempValid = true(1,fftLenVecMulFFTs(ind));validIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = 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);对于2048点FFT,默认延迟为4137。additionPipelineDelay = 6;额外管道延迟的百分比% 金宝appSimulink仿真结束时间总时延= FFT时延+%数据控制器(5个时钟周期)。%模拟运行总时间=总时间输入样本的百分比+总延迟+管道延迟。simTime = fftLenSinFFT*(length(fftLenVecMulFFTs) + 1) + latency + additionPipelineDelay;

可变大小的FFT使用单一FFT

使用单一FFT的可变尺寸FFT设计包括数据控制器、FFT块和Bin选择子系统。

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

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

多个FFTs供参考

该子系统被用作参考,与使用单一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'/多个FFTs供参考']);

运行Si金宝appmulink模型

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

运行模型sim卡命令在MATLAB命令行。

sim (modelname);

验证

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

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

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

以上模型VariableSizeFFTHDLExample要求输入数据样本之间的间隔最小。间隙取决于指定的FFT长度和设计处理的最大FFT长度。在某些情况下,输入数据可能不符合此模式。例如,数据可以是连续的,并且在输入数据样本的末尾用零填充。下图显示了一个连续的输入有效模式,在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”、“随机”开关zeroPaddingPattern情况下中间画的输入数据样本之间为零填充ind = 1:length(fftLenVecMulFFTs)生成FFT长度样本数据randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind)));输入数据样本之间为零填充upSamplingFac = fftLenSinFFT/fftLenVecMulFFTs(ind);dataIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = upsample(randInputData,upSamplingFac);%有效,对应生成的数据validIn((ind-1)*fftLenSinFFT+1:upSamplingFac:fftLenSinFFT*ind) = true;结束情况下“AtEnd”在输入数据样本的末尾填充为零ind = 1:length(fftLenVecMulFFTs)生成FFT长度样本数据randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind)));%零填充数据dataIn((ind-1)*fftLenSinFFT+1):((ind-1)*fftLenSinFFT+fftLenVecMulFFTs(ind))) = randInputData;%有效,对应生成的数据validIn((ind-1)*fftLenSinFFT+1):((ind-1)*fftLenSinFFT+fftLenVecMulFFTs(ind))) = true;结束否则%随机印第安纳州= 1:长度(fftLenVecMulFFTs)%零填充随机randIndices = randperm(fftLenSinFFT);生成FFT长度样本数据randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind)));指数= randIndices(1:fftLenVecMulFFTs(ind));%如果随机指标没有第一个样本如果(sum(indexes ==1)==0) indexes (1) =1;结束%零填充数据dataIn(indexes +(ind-1)*fftLenSinFFT) = randInputData;%有效,对应生成的数据validIn(indexes +(ind-1)*fftLenSinFFT) = true;结束结束

运行Simuli金宝appnk模型

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

sim (modelname);

验证

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

HDL代码生成和验证

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

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

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

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

另请参阅

(DSP HDL工具箱)