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

Отфильтрованный OFDM (F-OFDM) применяет фильтр к символам после ОБПФ в передатчике, чтобы улучшить пропускную способность при сохранении ортогональности сложных символов. Этот пример реализует передатчик F-OFDM для генерации HDL-кода. Пример показывает, как перейти от образца модели MATLAB ® к HDL-оптимизированной модели Simulink ®. Это включает преобразование типов с двойной точкой в фиксированные точки и минимизацию использования ресурсов проекта на 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. Множители в ПЛИС имеют ограниченные входы размера слова. Для примера DSP48 Xilinx имеет 18 * 25-битный множитель. Для оптимального проекта длина слова выбирается так, чтобы все умножители в БПФ и фильтре были меньше, чем 18 * 25-битные умножители. В этом примере блок FFT HDL Optimized использует опцию «Разделить выходы бабочки на два». Вход размера слова составляет 16 бит.

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

WORDLENGTH = 16;

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

FRACTIONLENGTH = WORDLENGTH - 2;

Генерация символов OFDM

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

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

С другой стороны, необходимая частота дискретизации вычисляется$SubcarrierSpacing * FFTLength$, и она равна 122,88 Msps для этого примера. Для достижения 122,88 Msps тактовая частота должна быть не менее 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 умножителей, поскольку выход ОБПФа комплексен. Даже при реализации с использованием симметричного фильтра ему нужно 513 умножителей, что слишком много умножителей для FPGA нормального размера. Чтобы уменьшить количество умножителей в фильтре, HDL Оптимизированная модель фильтрует в частотный диапазон. Фильтр частотного диапазона конечной импульсной характеристики требует БПФ входа, умноженного на БПФ коэффициентов, и затем ОБПФа результат. Количество комплексных умножителей в этом случае является

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

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

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

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

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

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

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

Для входных данных с фиксированной точкой выход БПФ внутри фильтра имеет рост разрядности = log2 (Nfft) = 11 биты. Чтобы сопоставить большинство умножителей с блоком DSP в FPGA, ограничьте вход размера слова. Для примера, если DSP имеет 25 * 18-битный множитель, 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;

Можно запустить следующую команду, чтобы проверить подсистему 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 МГц, которая соответствует необходимой тактовой частоте 196,8 МГц. В проекте используются 94 DSP48 (10%) и 24 блочных ОЗУ (4%).

Заключение

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

Похожие темы