exponenta event banner

Генерация кода HDL для фильтрованного передатчика OFDM (F-OFDM)

Отфильтрованное OFDM (F-OFDM) применяет фильтр к символам после IFFT в передатчике для улучшения полосы пропускания при сохранении ортогональности комплексных символов. В этом примере реализован передатчик F-OFDM для генерации кода HDL. В примере показано, как перейти от эталонной модели MATLAB ® к модели Simulink ®, оптимизированной для HDL. Он включает преобразование из двухточечного типа в тип с фиксированной точкой и минимизацию использования ресурсов конструкции в FPGA.

Сравнение форм сигналов OFDM и F-OFDM см. в документе F-OFDM и OFDM.

Системные параметры

Задайте требуемые свойства F-OFDM.

NDLRB             = 108;
WaveformType      = 'F-OFDM';
SubcarrierSpacing = 60*1e3; %Hz
CellRefP          = 1;
CyclicPrefix      = 'Normal';
FilterLength      = 513;
ToneOffset        = 2.5000;
CyclicExtension   = 'off';

Позвоните в h5gOFDMInfo для вычисления параметров F-OFDM. Способ вычисляет длину БПФ, длину циклического префикса и количество поднесущих.

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

Создание сетки входных данных

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

Ссылочная модель MATLAB

Эталонная модель работает в системе F-OFDM с плавающей запятой и строит график спектра. Используйте ссылочную модель для сравнения с моделью с фиксированной точкой, которая поддерживает генерацию кода HDL.

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

Моделирование канала путем добавления шума к сигналу.

snrdB = 18;
S = RandStream('mt19937ar','Seed',1);
rxSig_ref = awgn(double(txSig_ref),snrdB,'measured',S);

Принятый сигнал должен быть синхронизирован и выровнен. В реальных ситуациях приемник включает в себя синхронизацию символов. В этом примере приемник корректирует сдвиг кадра фильтром передатчика на.$\frac{FilterLength}{2}$

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

Восстановление данных, расчет BER и отображение совокупности.

[constDiagRx, ber, rxgrid_ref] = FOFDM_Receiver(rxSig_ref_sync, bitsIn, genb,...
                                 QAMModulation, 'F-OFDM Reception (REF)');
disp(['F-OFDM Reception (REF)', ' BER = ' num2str(ber(1)) ' at SNR = ' num2str(snrdB) ' dB']);
constDiagRx(rxgrid_ref(:));
F-OFDM Reception (REF) BER = 0.0094568 at SNR = 18 dB

Спектр показывает явное улучшение внеполосного излучения поддиапазонного сигнала и увеличение эффективной полосы пропускания.

FOFDMTransmitterHDLSpectrum(txSig_ref,txinfo,genb,'F-OFDM Spectrum (REF)');

Модель с фиксированной точкой Simulink

model = 'FOFDMTransmitterHDLExample_FixPt';
load_system(model);
open_system([model, '/F-OFDM']);

Для создания HDL на основе модели необходимо использовать тип данных с фиксированной точкой вместо двойного. Для 64-точечного QAM требуется не менее 6 бит + 1 бит знака. Однако для достижения разумного BER необходимо увеличить длину входного слова, учитывая ограничение FPGA. Множители в FPGA имеют ограниченную длину входного слова. Например, DSP48 Xilinx имеет 18 * 25-битный множитель. Для оптимальной конструкции длина слова выбирается так, чтобы все умножители в БПФ и фильтре были меньше 18 * 25-битных умножителей. В этом примере блок FFT HDL Optimized использует опцию «Разделить выходы бабочки на два». Длина входного слова составляет 16 бит.

Модель Simulink с данными с плавающей запятой можно запустить, установив параметр WORDLENGTH = -1. Однако этот режим не поддерживается для генерации кода HDL.

WORDLENGTH = 16;

Установите число дробных битов на WORDLENGTH - 2 бита для покрытия -1 < = Symbol < = 1.

FRACTIONLENGTH = WORDLENGTH - 2;

Формирование символов OFDM

Предполагается, что входные данные для ОБПФ являются надлежащим символом OFDM и находятся в памяти (подсистема символов OFDM в модели), которая может считываться подсистемой F-OFDM. Поэтому частота дискретизации передатчика зависит от доступности данных в памяти и тактовой частоты FPGA. Если данные доступны все время, то частота выборки ограничена

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

С другой стороны, требуемая частота дискретизации вычисляется и$SubcarrierSpacing * FFTLength$ равна 122,88 мс для этого примера. Для достижения 122,88 мс тактовая частота должна быть не менее 135,36 МГц.

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;
CyclicPrefixLengths = info.CyclicPrefixLengths;
SymbolsPerSubframe = info.SymbolsPerSubframe;

STOPTIME = 4 * TotSubframes * info.SamplesPerSubframe;

sim(model);
txSig_fixpt = TX_WAVEFORM(1: size(txSig_ref));

Моделирование канала путем добавления некоторого шума к сигналу. Следует отметить, что используется тот же шум, что и в ссылочной модели MATLAB.

S = RandStream('mt19937ar','Seed',1);
rxSig_fixpt = awgn(double(txSig_fixpt),snrdB,'measured',S);

Синхронизация символов, восстановление данных, вычисление BER и отображение совокупности.

rxSig_fixpt_sync = circshift(rxSig_fixpt,-floor(genb.FilterLength/2));

[constDiagRx,ber,rxgrid_fixpt] = FOFDM_Receiver(rxSig_fixpt_sync,bitsIn, ...
                                 genb, QAMModulation,'F-OFDM Reception (FIXED-POINT)');
disp(['F-OFDM Reception (FIXED-POINT)',' BER = ' num2str(ber(1)) ' at SNR = ' num2str(snrdB) ' dB']);
constDiagRx(rxgrid_fixpt(:));
F-OFDM Reception (FIXED-POINT) BER = 0.0094453 at SNR = 18 dB

Спектр показывает даже для фиксированной точки явное улучшение внеполосного излучения поддиапазонного сигнала и увеличение эффективной полосы пропускания.

FOFDMTransmitterHDLSpectrum(txSig_fixpt,txinfo,genb,'F-OFDM Spectrum (FIXED-POINT)');

Оптимизированная модель Simulink HDL

Модель с фиксированной точкой использует фильтр с 513 отводами во временной области. Для этого фильтра требуются умножители 2 * 513, поскольку выход IFFT сложен. Даже при реализации с использованием симметричного фильтра требуется 513 умножителей, что является слишком большим количеством умножителей для FPGA нормального размера. Чтобы уменьшить количество умножителей в фильтре, модель HDL Optimized фильтрует в частотной области. Фильтр FIR частотной области требует FFT входного сигнала, умноженного на FFT коэффициентов, и затем IFFT результата. Количество комплексных множителей в этом случае равно

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

Фильтр частотной области в этом примере использует 11 комплексных умножителей. Следует отметить, что фактическое количество вещественных умножителей зависит от установки блока БПФ и ОБПФ (опция комплексного умножения) и длины слова. В модели HDL Optimized фильтр FIR временной области заменяется фильтром FIR частотной области, реализованным с архитектурой сохранения перекрытия. Из-за перекрывающейся характеристики архитектуры сохранения перекрытий частота дискретизации ограничена

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

Поэтому для достижения частоты дискретизации 122,88 мс для этого примера тактовая частота должна быть по меньшей мере 196,8 МГц.

model = 'FOFDMTransmitterHDLExample_HDLOpt';
load_system(model);
open_system([model, '/F-OFDM']);

Задайте длину БПФ для фильтра. Длина должна быть не менее 2 * FilterLength для фильтрации в частотной области. Однако, поскольку он должен обрабатывать весь символ OFDM сразу, используйте Nfft для длины БПФ внутри фильтра. Затем вычислите БПФ коэффициентов. Битовый обратный результат, поскольку выходной сигнал БПФ для фильтра является битовым обратным.

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

Для входных данных с фиксированной точкой выход БПФ внутри фильтра имеет рост битов = log2 (Nfft) = 11 бит. Для преобразования большинства умножителей в блок DSP в FPGA ограничьте длину входного слова. Например, если DSP имеет 18-битовый множитель 25 *, WORDLENGTH должен быть 14 битами для достижения 25-битового выхода БПФ внутри фильтра. Также используйте 18-битовые коэффициенты.

WORDLENGTH = 14;
FRACTIONLENGTH = WORDLENGTH - 2;
if WORDLENGTH > 0 %for fixed point data
    COEF_WL = 18;
    COEF_FR = COEF_WL - 2;
    fftFnum = fi(fftFnum, 1, COEF_WL, COEF_FR,'RoundingMethod','Nearest',...
              'OverflowAction','Wrap');
end
STOPTIME = 4 * TotSubframes * info.SamplesPerSubframe;

sim(model);
txSig_HDLOpt = TX_WAVEFORM_HDLOpt(1: size(txSig_ref));

Моделирование канала путем добавления некоторого шума к сигналу. Следует отметить, что используется тот же шум, что и в ссылочной модели MATLAB.

S = RandStream('mt19937ar','Seed',1);
rxSig_HDLOpt = awgn(double(txSig_HDLOpt), snrdB, 'measured', S);

Синхронизация символов, восстановление данных, вычисление BER и отображение совокупности.

rxSig_HDLOpt_sync = circshift(rxSig_HDLOpt,-floor(genb.FilterLength/2));

[constDiagRx,ber,rxgrid_HDLOpt] = FOFDM_Receiver(rxSig_HDLOpt_sync,bitsIn,...
                                  genb, QAMModulation, 'F-OFDM Reception (HDLOPT)');
disp(['F-OFDM Reception (HDLOPT)',' BER = ' num2str(ber(1)) ' at SNR = ' num2str(snrdB) ' dB']);
constDiagRx(rxgrid_HDLOpt(:));
F-OFDM Reception (HDLOPT) BER = 0.010038 at SNR = 18 dB

Спектр показывает даже для фиксированной точки явное улучшение внеполосного излучения поддиапазонного сигнала и увеличение эффективной полосы пропускания.

FOFDMTransmitterHDLSpectrum(txSig_HDLOpt,txinfo,genb,'F-OFDM Spectrum (HDLOPT)');

Создание кода HDL и испытательного стенда

Используйте временный каталог для созданных файлов:

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

Для проверки совместимости генерации кода HDL в подсистеме F-OFDM можно выполнить следующую команду:

     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 МГц, которая соответствует требуемой тактовой частоте 196,8 МГц. В проекте используется 94 DSP48 (10%) и 24 блока RAM (4%).

Заключение

В этом примере была разработана модель с фиксированной точкой Simulink, оптимизированная для аппаратного обеспечения. Модель минимизировала использование ресурсов за счет оптимизации использования DSP в FPGA. Сравнение результатов модели с плавающей запятой с моделью с фиксированной запятой показывает, что 16-битовые данные имеют частоту битовых ошибок, сходную с данными с плавающей запятой.

Связанные темы