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

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

Обратитесь к F-OFDM по сравнению с Модуляцией OFDM для сравнения между OFDM и формами волны F-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 из модели, тип данных с фиксированной точкой должен использоваться вместо дважды. Для QAM с 64 точками по крайней мере 6 битов + необходим 1 знаковый бит. Однако, чтобы достигнуть разумного BER, входной размер слова должен быть увеличен, рассмотрев ограничение FPGA. Множители в FPGAs ограничили входной размер слова. Например, DSP48 Xilinx имеет 18*25-bit множитель. Для оптимального проекта выбран wordlength так, чтобы все множители в БПФ и фильтре были меньшими, чем 18*25-bit множители. В этом примере блок FFT HDL Optimized использует, "Делят бабочку выходные параметры на две" опции. Входной размер слова составляет 16 битов.

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

WORDLENGTH = 16;

Определите номер дробных битов к WORDLENGTH - 2 бита, чтобы покрыть-1 <= Символ <= 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)');

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

Модель фиксированной точки использует фильтр с 513 касаниями во временном интервале. Этот фильтр требует 2*513 множителей, поскольку выход ОБПФ является комплексным. Реализовано с помощью симметричного фильтра требуется 513 множителей, который является слишком многими множителями для FPGA нормального размера. Чтобы сократить количество множителей в фильтре, модель HDL Optimized просачивается частотный диапазон. КИХ-фильтр частотного диапазона требует БПФ входа, умноженного на БПФ коэффициентов и затем ОБПФ результат. Количество комплексных множителей в этом случае

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

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

$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 имеет 25*18-bit множитель, 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 блока RAM (4%).

Заключение

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте