主要内容

滤波OFDM (F-OFDM)发射机的HDL代码生成

滤波OFDM (F-OFDM)在发射机iffft后对符号进行滤波,以提高带宽,同时保持复杂符号的正交性。这个例子实现了一个用于HDL代码生成的发射器F-OFDM。这个例子展示了如何从MATLAB®参考模型到hdl优化的Simulink®模型。金宝app它包括从双点类型转换为定点类型,以及最大限度地减少FPGA上设计的资源使用。

F-OFDM与OFDM调制用于OFDM和F-OFDM波形的比较。

系统参数

设置所需的F-OFDM属性。

NDLRB = 108;WaveformType =“F-OFDM”;SubcarrierSpacing = 60*1e3;%赫兹CellRefP = 1;CyclicPrefix =“正常”;FilterLength = 513;ToneOffset = 2.5000;CyclicExtension =“关闭”

调用h5gOFDMInfo函数来计算F-OFDM参数。该方法计算FFT长度、循环前缀长度和子载波数。

Genb = struct(“NDLRB”NDLRB,...“WaveformType”WaveformType,...“SubcarrierSpacing”SubcarrierSpacing * 1 e - 3,...“FilterLength”FilterLength,...“ToneOffset”ToneOffset,...“CellRefP”CellRefP,...“CyclicPrefix”CyclicPrefix,...“CyclicExtension”, CyclicExtension);info = h5gOFDMInfo(genb);

生成输入数据的网格

QAMModulation =64 qam;TotSubframes = 5;[txgrid, bitsIn] = generateOFDMGrid(genb,info,QAMModulation,TotSubframes);

参考MATLAB模型

参考模型运行一个浮点F-OFDM系统并绘制频谱。使用参考模型与支持HDL代码生成的定点模型进行比较。金宝app

[txSig_ref,txinfo] = h5gofdmmodulation (genb,txgrid);

通过向信号中添加噪声来建模信道。

snrdB = 18;S = RandStream(“mt19937ar”“种子”1);rxSig_ref = awgn(double(txSig_ref),snrdB,“测量”,年代);

接收到的信号必须同步并对齐。在实际情况下,接收机包括符号同步。在本例中,接收机通过发送滤波器校正帧的移位$ \压裂{FilterLength} {2} $

rxSig_ref_sync = circshift(rxSig_ref,-floor(FilterLength/2));

数据恢复、误码率计算、星座显示。

[constDiagRx, ber, rxgrid_ref] = FOFDM_Receiver(rxSig_ref_sync, bitsIn, genb,...QAMModulation,F-OFDM接收(REF));disp ([F-OFDM接收(REF)' ber = 'num2str (ber) (1)' at SNR = 'num2str (snrdB)“数据库”]);constDiagRx (rxgrid_ref (:));释放(constDiagRx);
F-OFDM接收(REF) BER = 0.0094568, SNR = 18 dB

频谱显示子带信号的带外辐射明显改善,有效带宽增加。

FOFDMTransmitterHDLSpectrum (txSig_ref txinfo genb,F-OFDM频谱(REF));

金宝appSimulink定点模型

模型=“FOFDMTransmitterHDLExample_FixPt”;load_system(模型);open_system([模型,' / F-OFDM ']);

为了从模型生成HDL,必须使用定点数据类型而不是双数据类型。对于64位QAM,至少需要6位+ 1个符号位。但是,考虑到FPGA的局限性,为了达到合理的误码率,必须增加输入字长。fpga中的乘法器有有限的输入字长。例如,Xilinx的DSP48具有18*25位乘数。对于最优设计,选择一个字长,使FFT和滤波器中的所有乘法器都小于18*25位乘法器。在这个例子中,FFT块使用了“将蝴蝶输出一分为二”选项。输入字长为16位。

通过设置WORDLENGTH=-金宝app1,可以使用浮点数据运行Simulink模型。但是,这种模式不支持HDL代码生成。金宝app

Wordlength = 16;

将小数位数设置为WORDLENGTH - 2位以覆盖-1 <= Symbol <= 1。

Fractionlength = wordlength - 2;

生成OFDM符号

IFFT的输入数据被假定为一个合适的OFDM符号,并驻留在可以被F-OFDM子系统读取的内存(模型中的OFDM符号子系统)中。因此,发射器的采样率取决于内存中的数据可用性和FPGA时钟频率。如果数据一直可用,则采样率限制为

$clock\_frequency * \frac{FFTLength}{(FFTLength + Max(CyclicPrefixLength))}$

另一方面,所需的抽样率由$SubcarrierSpacing * FFTLength$在本例中,它等于122.88 Msps。要达到122.88 Msps,时钟频率至少应该是135.36 MHz。

ifftin = generateOFDMSymbol(txgrid,info,genb);

滤波器的设计

适当的滤波器应该在子载波上有一个平坦的通带,并有一个锐利的过渡来最小化保护带。它还需要足够的阻带衰减。滤波器原型$w = w_{1} * w_{2}$使用,其中美元w_ {1} $是SINC函数,

$w_{2} = o.5*(1 + cos(\frac{2*\pi*n}{n -1}))$

fnum = generateFilterCoef(genb,info);

模拟

设置模型并运行。注意,由于系统延迟,模型需要模拟更长的时间来收集足够的数据。

Nfft = info.Nfft;cyclicprefixlength = info. cyclicprefixlength;SymbolsPerSubframe = info.SymbolsPerSubframe;STOPTIME = 4 * TotSubframes * info.SamplesPerSubframe;sim(模型);txSig_fixpt = tx_波形(1:大小(txSig_ref));

通过向信号中添加一些噪声来建模信道。注意,使用的噪声与参考MATLAB模型相同。

S = RandStream(“mt19937ar”“种子”1);rxSig_fixpt = awgn(double(txSig_fixpt),snrdB,“测量”,年代);

符号同步、数据恢复、误码率计算、星座显示。

rxSig_fixpt_sync = circshift(rxSig_fixpt,-floor(genb.FilterLength/2));[constDiagRx,ber,rxgrid_fixpt] = FOFDM_Receiver(rxSig_fixpt_sync,bitsIn,...genb QAMModulation,F-OFDM接收(定点));disp ([F-OFDM接收(定点)' ber = 'num2str (ber) (1)' at SNR = 'num2str (snrdB)“数据库”]);constDiagRx (rxgrid_fixpt (:));
F-OFDM接收(定点)误码率= 0.0094453,信噪比= 18 dB

频谱显示,即使是定点,子带信号的带外辐射也有明显改善,有效带宽增加。

FOFDMTransmitterHDLSpectrum (txSig_fixpt txinfo genb,F-OFDM频谱(定点));

金宝appSimulink hdl优化模型

定点模型在时域中使用513-tap滤波器。该滤波器需要2*513乘法器,因为IFFT的输出是复杂的。即使使用对称滤波器实现,也需要513个乘法器,这对于正常大小的FPGA来说太多了。为了减少滤波器中的乘法器数量,该模型在频域进行滤波。频域FIR滤波器需要输入的FFT乘以系数的FFT,然后IFFT结果。这里复乘子的个数是

$2*ceil(\frac{log2(FFTLength)}{2}) - 1$

本例中的频域滤波器使用了11个复乘法器。注意,实乘法器的实际数量取决于FFT和IFFT块设置(复杂乘法选项)和单词长度。在该模型中,时域FIR滤波器被采用重叠保存结构实现的频域FIR滤波器所取代。由于重叠保存结构的重叠特性,采样率被限制在

$clock\_frequency * \frac{FFTLength}{(FFTLength + Max(CyclicPrefixLength) + 2*(FilterLength -1))}$

因此,要在本例中实现122.88 Msps采样率,时钟频率必须至少为196.8 MHz。

模型=“FOFDMTransmitterHDLExample_HDLOpt”;load_system(模型);open_system([模型,' / F-OFDM ']);

设置过滤器的FFT长度。频域过滤时,长度至少为2*FilterLength。但是,由于它必须一次处理整个OFDM符号,在滤波器内部使用Nfft作为FFT长度。然后,计算系数的FFT。位反转结果,因为滤波器的FFT输出是位反转的。

filterFFTLen = Nfft;fftFnum = bitrevorder(fft(fnum,filterFFTLen).');

对于定点输入数据,过滤器内部FFT的输出具有bit-growth = log2(Nfft) = 11位。为了将大部分乘法器映射到FPGA中的DSP块中,需要限制输入字长。例如,如果DSP有一个25*18位的倍增器,WORDLENGTH必须为14位才能在滤波器内实现25位的FFT输出。另外,使用18位系数。

Wordlength = 14;Fractionlength = wordlength - 2;如果字长> 0%用于定点数据Coef_wl = 18;Coef_fr = coef_wl - 2;fftFnum = fi(fftFnum, 1, COEF_WL, COEF_FR,“RoundingMethod”“最近的”...“OverflowAction”“包装”);结束STOPTIME = 4 * TotSubframes * info.SamplesPerSubframe;sim(模型);txSig_HDLOpt = TX_WAVEFORM_HDLOpt(1: size(txSig_ref));

通过向信号中添加一些噪声来建模信道。注意,使用的噪声与参考MATLAB模型相同。

S = RandStream(“mt19937ar”“种子”1);rxSig_HDLOpt = awgn(double(txSig_HDLOpt), snrdB,“测量”,年代);

符号同步、数据恢复、误码率计算、星座显示。

rxSig_HDLOpt_sync = circshift(rxSig_HDLOpt,-floor(genb.FilterLength/2));[constDiagRx,ber,rxgrid_HDLOpt] = FOFDM_Receiver(rxSig_HDLOpt_sync,bitsIn,...genb QAMModulation,F-OFDM接收(HDLOPT));disp ([F-OFDM接收(HDLOPT)' ber = 'num2str (ber) (1)' at SNR = 'num2str (snrdB)“数据库”]);constDiagRx (rxgrid_HDLOpt (:));释放(constDiagRx);
F-OFDM接收(HDLOPT)误码率= 0.010038,信噪比= 18 dB

频谱显示,即使是定点,子带信号的带外辐射也有明显改善,有效带宽增加。

FOFDMTransmitterHDLSpectrum (txSig_HDLOpt txinfo genb,F-OFDM频谱(HDLOPT));

生成HDL代码和测试台

为生成的文件使用临时目录:

systemname = 'FOFDMTransmitterHDLExample_HDLOpt/F-OFDM';Workingdir = tempname;

您可以运行以下命令来检查F-OFDM子系统的HDL代码生成兼容性:

checkhdl (systemname TargetDirectory, workingdir);

运行以下命令生成HDL代码:

makehdl (systemname TargetDirectory, workingdir);

运行如下命令生成测试台:

makehdltb (systemname TargetDirectory, workingdir);

合成的结果

该设计是为Xilinx Zynq-7000 (xc7z045-ffg900,速度等级2)使用Vivado合成的。这个FPGA有900个DSP48片,因此,定点版本的设计不适合这个设备。该芯片采用hdl优化设计,实现了205.8 MHz的时钟频率,满足196.8 MHz的时钟频率要求。该设计使用94个DSP48(10%)和24块ram(4%)。

结论

在本例中,为硬件开发并优化了Simu金宝applink定点模型。该模型通过优化DSP在FPGA上的使用,最大限度地减少了资源的使用。将浮点模型和定点模型的结果进行比较,发现16位数据的误码率与浮点数据的误码率相似。

相关的话题