Фильтрованный 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);
Эталонная модель запускает систему 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,'5G F-OFDM Spectrum (REF)');
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 в модели), который может быть считан Подсистемой F-OFDM. Поэтому частота дискретизации передатчика зависит от доступности данных в памяти и частоте часов FPGA. Если данные доступны все время, то частота дискретизации ограничивается
.
С другой стороны, необходимая частота дискретизации вычисляется, и это равно 122.88 членам Шотландского парламента для этого примера. Чтобы достигнуть 122.88 членов Шотландского парламента, частота часов должна составить по крайней мере 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.009505 at SNR = 18 dB
Спектр показывает даже для фиксированной точки ясное улучшение внеполосного излучения сигнала поддиапазона и увеличение эффективной ширины полосы пропускания.
FOFDMTransmitterHDLSpectrum(txSig_fixpt,txinfo,genb,'5G F-OFDM Spectrum (FIXED-POINT)');
Модель фиксированной точки использует фильтр с 513 касаниями во временном интервале. Этот фильтр требует 2*513 множителей, поскольку вывод ОБПФ является комплексным. Реализовано с помощью симметричного фильтра требуется 513 множителей, который является слишком многими множителями для FPGA нормального размера. Чтобы сократить количество множителей в фильтре, модель HDL Optimized просачивается частотный диапазон. КИХ-фильтр частотного диапазона требует БПФ входа, умноженного на БПФ коэффициентов и затем ОБПФ результат. Количество комплексных множителей в этом случае
.
Частотный диапазон просачивается этот пример использование 11 комплексных множителей. Обратите внимание на то, что фактическое количество действительных множителей зависит от установки блока FFT и IFFT (Комплексная опция умножения) и размер слова. В модели HDL Optimized КИХ-фильтр области времени заменяется КИХ-фильтром частотного диапазона, реализованным с архитектурой сохранения перекрытие. Из-за перекрывающейся характеристики архитектуры сохранения перекрытие, частота дискретизации ограничивается
.
Поэтому, чтобы достигнуть 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 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.0099803 at SNR = 18 dB
Спектр показывает даже для фиксированной точки ясное улучшение внеполосного излучения сигнала поддиапазона и увеличение эффективной ширины полосы пропускания.
FOFDMTransmitterHDLSpectrum(txSig_HDLOpt,txinfo,genb,'5G 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 блока RAM (4%).
В этом примере модель фиксированной точки Simulink была разработана и оптимизирована для оборудования. Модель минимизировала использование ресурсов путем оптимизации использования DSP на FPGA. Сравнение результатов модели с плавающей точкой с моделью фиксированной точки показывает, что 16-битные данные имеют подобную частоту ошибок по битам к данным с плавающей точкой.