主要内容

一种可变大小FFT的HDL实现

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

此示例包括两个型号variableizebfthdlexample.variableizebrytarbitraryvaliddatternhdlexample.显示不同输入有效模式的可变尺寸FFT实现。

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

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

模型架构

两个模型中的顶级子系统实现了一个变量大小的FFT。顶部子系统使用单个FFT块,底部子系统通过使用多种各种尺寸的多个FFT块提供参考数据。

该模型variableizebfthdlexample.可以在有效样本之间处理具有间隙的数据,只要间隙取决于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);%生成| Fftlenin |通过重复| FFTLENVECMULFFTS的每个元素|经过% |fftLenSinFFT|遍历,并在单个列中排列。fflen = repmat(fftlenvecmulffts。',fftlensinfft,1);Fftlenin = UINT16(FFLEN(:));

输入生成

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

dat信号由填充零randinputdata.样品。下图显示了输入数据和有效模式Fftlenvecmulffts.256和512和fftLenSinFFT在2048年。对于256的FFT长度,示例为每个有效样本插入7个无效样本;对于512的FFT长度,代码为每个有效样本插入3个无效样本。

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

rng ('默认');Datain =零(长度(FFTLenvecmulffts)* fftlensinfft,1);有效= false(长度(fftlenvecmulffts)* fftlensinfft,1);%循环FFT长度为了IND = 1:长度(FFTLENVECMULFFTS)%生成FFT长度样本的数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));输入数据样本之间的%零填充upSamplingFac = fftLenSinFFT / fftLenVecMulFFTs(印第安纳州);dataIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (randInputData upSamplingFac);%有效对应于生成的数据tempvalid = true(1,fftlenvecmulffts(ind));vidinin((ind-1)* fftlensinfft + 1:fftlensinfft * ind)= upsample(tempvalid,upsamplingfac);结尾InputDatatype =.'fixdt(1,16,14)'%输入数据类型可以在此处修改set_param (“VariableSizeFFTHDLExample /数据类型转换”“OutDataTypeStr”,inputDatatype);获取FFT延迟fftobj = dsp.hdlfft(“FFTLength”,fftlensinfft,......“架构”“流基数2 ^ 2”......'ComplexMultiplication''使用3个乘数和5个加法者'......“BitReversedOutput”假的,......'bitreversedinput'假的,......'正常化',错误的);延迟= getLatency(fftobj);%默认延迟为4137 2048点FFT。附加百分点= 6;%额外的管道延迟数量%S金宝appimulink仿真结束时间总延迟= FFT +延迟的延迟%数据控制器(5个时钟周期)。%仿真运行时间=总计%输入样本数+总延迟+管道延迟。simTime = fftLenSinFFT*(length(fftLenVecMulFFTs) + 1) + latency + additionPipelineDelay;

可变尺寸FFT使用单个FFT

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

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的输出进行比较。该子系统包括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中的两个子系统的输出。

使用模型使用SIMMATLAB命令行的命令。

sim (modelname);

验证

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

dataout1 = OUT1(:);dataout2 = OUT2(:);figwsf = figure(“可见”“关闭”);绘图(ABS(DataOut1-DataOut2));标题(“固定有效模式的两个输出之间的差异”)包含(“样本指数”);ylabel(“错误”);figwsf.visible ='在';bdclose (modelname);

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

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

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

modelname =.'variableibleizefftarbitraryvaliddatternhdlexample';load_system(modelname);Open_System([ModelName'/可变尺寸FFT使用单个FFT / Data Controller']);

任意输入数据和有效生成

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

%初始化输入数据和有效Datain =零(长度(FFTLenvecmulffts)* fftlensinfft,1);有效= false(长度(fftlenvecmulffts)* fftlensinfft,1);zeropadddingpattern ='inbetween'%’AtEnd”、“随机”开关zeroPaddingPattern案件'inbetween'输入数据样本之间的%零填充为了IND = 1:长度(FFTLENVECMULFFTS)%生成FFT长度样本的数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));输入数据样本之间的%零填充upSamplingFac = fftLenSinFFT / fftLenVecMulFFTs(印第安纳州);dataIn ((ind-1) * fftLenSinFFT + 1: fftLenSinFFT *印第安纳州)= upsample (randInputData upSamplingFac);%有效对应于生成的数据vidinin((ind-1)* fftlensinfft + 1:upsamplingfac:fftlensinfft * ind)= true;结尾案件'ateen'输入数据样本结束时%零填充为了IND = 1:长度(FFTLENVECMULFFTS)%生成FFT长度样本的数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));%零填充数据dataIn (((ind-1) * fftLenSinFFT + 1): ((ind-1) * fftLenSinFFT + fftLenVecMulFFTs(印第安纳州)))= randInputData;%有效对应生成的数据vidinin(((ind-1)* fftlensinfft + 1):((ind-1)* fftlensinfft + fftlenvecmulffts(ind)))= true;结尾否则% 随机的为了IND = 1:长度(FFTLENVECMULFFTS)随机%零填充randindices = randperm(fftlensinfft);%生成FFT长度样本的数据randInputData =复杂(randn (fftLenVecMulFFTs(印第安纳州)),randn (1, fftLenVecMulFFTs(印第安纳州)));指数= randIndices (1: fftLenVecMulFFTs(印第安纳州));%如果随机指数没有第一个样本如果(总和(indices == 1)== 0)索引(1)= 1;结尾%零填充数据日期(索引+(IND-1)* FFTLENSINFFT)= RANDINPUTDATA;%有效对应生成的数据validIn(指数+ (ind-1) * fftLenSinFFT) = true;结尾结尾

运行Simuli金宝appnk模型

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

sim (modelname);

验证

dataout1 = OUT1(:);dataout2 = OUT2(:);figvsfaiv = figure(“可见”“关闭”);绘图(ABS(DataOut1-DataOut2));标题(“任意有效模式的两个输出之间的差异”)包含(“样本指数”);ylabel(“错误”);figvsfaiv.visible ='在';bdclose (modelname);

HDL代码生成与验证

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

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

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

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

也可以看看

(DSP系统工具箱)