Отфильтрованный 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);
Образец модели запускает систему 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);
Принятый сигнал должен быть синхронизирован и выровнен. В реальных ситуациях приемник включает в себя символьную синхронизацию. В этом примере приемник исправляет сдвиг системы координат фильтром передатчика в.
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)');
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 Symbol в модели), которая может считываться подсистемой F-OFDM. Поэтому частота дискретизации передатчика зависит от доступности данных в памяти и тактовой частоте FPGA. Если данные доступны постоянно, то частота дискретизации ограничена
.
С другой стороны, необходимая частота дискретизации вычисляется, и она равна 122,88 Msps для этого примера. Для достижения 122,88 Msps тактовая частота должна быть не менее 135,36 МГц.
ifftin = generateOFDMSymbol(txgrid,info,genb);
Соответствующий фильтр должен иметь плоскую полосу пропускания по поднесущим и резкий переход для минимизации защитных полос. Это также нуждается в достаточном затухании в полосе задерживания. Используется фильтр прототипа, где является функцией SINC и
.
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)');
Модель с фиксированной точкой использует фильтр с 513 касаниями во временном интервале. Этот фильтр требует 2 * 513 умножителей, поскольку выход ОБПФа комплексен. Даже при реализации с использованием симметричного фильтра ему нужно 513 умножителей, что слишком много умножителей для FPGA нормального размера. Чтобы уменьшить количество умножителей в фильтре, HDL Оптимизированная модель фильтрует в частотный диапазон. Фильтр частотного диапазона конечной импульсной характеристики требует БПФ входа, умноженного на БПФ коэффициентов, и затем ОБПФа результат. Количество комплексных умножителей в этом случае является
.
Фильтр частотного диапазона в этом примере использует 11 комплексных умножителей. Обратите внимание, что фактическое количество действительных умножителей зависит от установки блоков FFT и IFFT (опция комплексного умножения) и размера слова. В модели HDL Optimized временного интервала конечной импульсной характеристики фильтр заменяется частотным диапазоном конечной импульсной характеристики фильтром, реализованным с архитектурой сохранения перекрытия. Из-за перекрывающейся характеристики архитектуры сохранения перекрытия, частота дискретизации ограничена
.
Поэтому, чтобы достичь 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)');
Используйте временную директорию для сгенерированных файлов:
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-битные данные имеют аналогичную частоту битовой ошибки с плавающей точкой данных.