Этот пример показывает, как реализовать БПФ переменного размера с помощью одного ядра БПФ.
Этот пример включает две модели VariableSizeFFTHDLExample и VariableSizeFFTArbitraryValidPatternHDLExample, которые показывают реализации БПФ переменного размера для различного входа допустимые шаблоны.
Много популярных стандартов как WLAN, WiMax, Широковещательная передача цифрового видео (DVB), Широковещательная передача цифрового аудио (DAB) и Долгосрочная эволюция (LTE) предоставляют несколько возможностей пропускной способности. Необходимая длина БПФ для модуляции OFDM и демодуляции для этих стандартов меняется в зависимости от опции пропускной способности. Например, LTE поддерживает различные опции пропускной способности канала от 1,4 МГц до 20 МГц, который требует длин БПФ 128 - 2 048 соответственно. Блок FFT HDL Optimized генерирует HDL-код для определенной длины БПФ. Этот пример демонстрирует, как использовать блок FFT HDL Optimized, чтобы реализовать БПФ переменного размера.
Этот пример генерирует входные данные в MATLAB® и импортирует его к Simulink® для симуляции. Импортированные данные питаются реализации БПФ переменного размера с помощью одного БПФ и нескольких БПФ. Чтобы продемонстрировать, что реализация одно БПФ совпадает с результатами использования нескольких БПФ различных размеров, оба, потоки вывода от симуляции Simulink экспортированы в MATLAB и сравнены.
Чтобы запустить этот пример, используйте скрипт VariableSizeFFTHDL.m.
Подсистема верхнего уровня в обеих моделях реализует БПФ переменного размера. Главная подсистема использует один блок FFT, и нижняя подсистема обеспечивает справочные данные при помощи нескольких блоков БПФ различных размеров.
Модель VariableSizeFFTHDLExample может обработать данные с разрывом между допустимыми выборками, который зависит от длин БПФ.
modelname = 'VariableSizeFFTHDLExample';
open_system(modelname);
Длины БПФ заданы через переменную fftLenVecMulFFTs
. Самая большая из этих длин хранится в переменной fftLenSinFFT
и используемый в качестве длины БПФ для блока FFT в подсистеме 'Variable Size FFT using Single FFT'
.
Вход fftLenIn
сгенерирован при помощи вектора длин БПФ, заданных в fftLenVecMulFFTs
.
fftLenVecMulFFTs = [128;256;512;1024;2048]; % Single FFT length used by variable size FFT. fftLenSinFFT = max(fftLenVecMulFFTs); % Generate |fftLenIn| by repeating each element of |fftLenVecMulFFTs| by % |fftLenSinFFT| times and arranging in a single column. fflen =repmat(fftLenVecMulFFTs.',fftLenSinFFT,1); fftLenIn = uint16(fflen(:));
dataIn
, validIn
и входные параметры fftLenIn
сгенерированы в MATLAB и импортированы в модель Simulink. Случайные комплексные входные данные randInputData
сгенерированы для каждой из длин БПФ, заданных в fftLenVecMulFFTs
. Различные длины БПФ соответствуют различной пропускной способности и различным уровням выборки. Например, в LTE, длины БПФ 128, 256, 512, 1024 и 2048 соответствуют уровням выборки 1,92 МГц, 3,84 МГц, 7,68 МГц, 15,36 МГц и 30,72 МГц соответственно. Время символа для любой длины БПФ. Пример действует на самом высоком уровне среди заданных длин БПФ.
Сигнал dataIn
сгенерирован путем дополнения нулей, промежуточных выборки randInputData
. Фигура ниже показов входные данные и допустимые шаблоны для fftLenVecMulFFTs
256 и 512 и fftLenSinFFT
, являющийся 2048. Для длины БПФ 256, пример вставляет 7 недопустимых выборок для каждой допустимой выборки и для длины БПФ 512, код вставляет 3 недопустимых выборки для каждой допустимой выборки.
Модель VariableSizeFFTHDLExample требует, чтобы вход допустимый шаблон имел разрыв между допустимыми выборками как показано в фигуре ниже.
rng('default'); dataIn = zeros(length(fftLenVecMulFFTs)*fftLenSinFFT,1); validIn = false(length(fftLenVecMulFFTs)*fftLenSinFFT,1); % Loop over the FFT lengths for ind = 1:length(fftLenVecMulFFTs) % Generate data of FFT length samples randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind))); % Zero padding in between input data samples upSamplingFac = fftLenSinFFT/fftLenVecMulFFTs(ind); dataIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = upsample(randInputData,upSamplingFac); % Valid corresponding to the generated data tempValid = true(1,fftLenVecMulFFTs(ind)); validIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = upsample(tempValid,upSamplingFac); end inputDataType = 'fixdt(1,16,14)'; % Input data type can be modified here set_param('VariableSizeFFTHDLExample/Data Type Conversion','OutDataTypeStr', inputDataType); % Get FFT latency fftObj = dsp.HDLFFT('FFTLength',fftLenSinFFT,... 'Architecture','Streaming Radix 2^2',... 'ComplexMultiplication','Use 3 multipliers and 5 adders',... 'BitReversedOutput',false,... 'BitReversedInput',false,... 'Normalize',false); latency=getLatency(fftObj); % Default latency is 4137 for 2048 point FFT. additionPipelineDelay = 6; % Number of additional pipeline delays % Simulink simulation end time Total Latency = Latency of FFT + Latency of % data controller (5 clock cycles). % Total simulation running time = Total % number of input samples + Total Latency + Pipeline delay. simTime = fftLenSinFFT*(length(fftLenVecMulFFTs) + 1) + latency + additionPipelineDelay ;
Проект 'Variable-Size FFT using Single FFT'
включает Контроллер Данных, блок FFT HDL Optimized и подсистему выбора Интервала.
open_system([modelname '/Variable Size FFT using Single FFT']);
Подсистема Data Controller
управляет входными данными так, чтобы вход к блоку FFT HDL Optimized имел выборки данных с нулями, дополненными промежуточный их. Блок FFT HDL Optimized сконфигурирован для длины БПФ 2 048, самая большая длина БПФ, требуемая стандартом LTE. Чтобы упростить выбор выходных интервалов, блок FFT сконфигурирован, чтобы вывести выборки в битном естественном порядке. Длина БПФ задана через входной порт и выбирается в начале кадра. Требуемая длина БПФ должна быть задержана, чтобы совпадать с задержкой БПФ. Длина БПФ указана с помощью выходного сигнала запуска БПФ и сгенерированного конца сигнала кадра. Этот метод старается не реализовывать большую совпадающую с задержкой память. Начиная с входных данных имеет нули промежуточные выборки, вывод большого БПФ содержит повторенные копии выборок длины БПФ. Чтобы получить необходимый FFT вывод, первые выборки длины БПФ собраны из FFT вывод. Эта операция выполняется путем изменения вывода допустимый сигнал БПФ с помощью подсистемы Bin selection
.
Эта подсистема используется в качестве ссылки, чтобы выдержать сравнение с выводом Переменного БПФ Размера с помощью Одного БПФ. Подсистема включает пять различных блоков БПФ (БПФ 128, БПФ 256, БПФ 512, БПФ 1024 и БПФ 2048) и один блок MATLAB function. Входные данные будут питаться все пять БПФ. В зависимости от требуемой длины БПФ активируется один из пяти блоков FFT, и операция FFT выполняется. Блок MATLAB function pickFFTData
выбирает вывод из соответствующего блока FFT. Вывод сохранен в MATLAB для сравнения с выводом БПФ Переменного Размера с помощью Одного БПФ.
open_system([modelname '/Multiple FFTs for Reference']);
Скрипт MATLAB VariableSizeFFTHDL.m конфигурирует желаемый вектор длин БПФ, размер одного БПФ, и генерирует входные данные с допустимым сигналом. Это затем запускает модель и сравнивает вывод этих двух подсистем в MATLAB.
Запустите модель с помощью команды sim
на командной строке MATLAB.
sim(modelname);
Вывод от обеих подсистем отправляется в рабочее пространство MATLAB, и различие построено. В этом случае, вывод этих двух подсистем идентичны, и ошибка между этими двумя множествами значений 0.
dataOut1 = out1(:); dataOut2 = out2(:); figure; plot(abs(dataOut1-dataOut2)); title('Difference between the two outputs for fixed valid pattern') xlabel('Sample Index'); ylabel('Error'); bdclose(modelname);
Вышеупомянутая модель VariableSizeFFTHDLExample имеет требование наличия минимального разрыва между выборками входных данных. Разрыв зависит от заданной длины БПФ и самой большой длины БПФ, обработанной проектом. Могут быть случаи, где входные данные не могут соответствовать этому шаблону. Например, данные могут быть непрерывны и заполнены с нулями в конце выборок входных данных. Следующие данные показывают непрерывный вход допустимый шаблон с недопустимыми выборками, дополненными в конце выборок входных данных для длин БПФ 256 и 512. Одна длина БПФ установлена в 2 048. В этом случае 256 допустимых выборок сопровождаются 1 792 недопустимыми выборками, и 512 допустимых выборок сопровождаются 1 536 недопустимыми выборками.
В таком сценарии проект должен сохранить входные выборки в RAM и заполнить недопустимые выборки между допустимыми выборками перед пересылкой его к БПФ. Модель VariableSizeFFTArbitraryValidPatternHDLExample может обработать любой произвольный шаблон допустимого входа, пока разрыв между кадрами является, по крайней мере, одной длиной БПФ (2 048 выборок для LTE). Эта модель совпадает с моделью VariableSizeFFTHDLExample, за исключением подсистемы контроллера данных. Подсистема контроллера данных в модели использует RAM размера 2*fftLenSinFFT
(как показано в фигуре ниже), чтобы сохранить входные выборки, считывает допустимые выборки при дополнении нулей между ними и затем передаче их БПФ. В то время как входные данные пишутся в одну половину памяти, данные считаны из другой половины памяти. В результате общая задержка увеличена fftLenSinFFT
.
modelname = 'VariableSizeFFTArbitraryValidPatternHDLExample'; load_system(modelname); open_system([modelname '/Variable Size FFT using Single FFT/Data Controller']);
Для генерации произвольных данных и допустимых входных параметров, пользователи могут выбрать любую из этих трех опций: нулевое дополнение фиксированного размера промежуточные выборки данных, нулевое дополнение в конце выборок данных и нулевое дополнение случайного размера промежуточные выборки данных. Входные данные и допустимую генерацию для этих трех различных нулевых дополнительных шаблонов показывают ниже. Модель VariableSizeFFTArbitraryValidPatternHDLExample использует сгенерированные данные и допустимый для симуляции и верификации.
% Initialization of input data and valid dataIn = zeros(length(fftLenVecMulFFTs)*fftLenSinFFT,1); validIn = false(length(fftLenVecMulFFTs)*fftLenSinFFT,1); zeroPaddingPattern = 'InBetween'; %'AtEnd','Random' switch zeroPaddingPattern case 'InBetween' % Zero padding in between input data samples for ind = 1:length(fftLenVecMulFFTs) % Generate data of FFT length samples randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind))); % Zero padding in between input data samples upSamplingFac = fftLenSinFFT/fftLenVecMulFFTs(ind); dataIn((ind-1)*fftLenSinFFT+1:fftLenSinFFT*ind) = upsample(randInputData,upSamplingFac); % Valid corresponding to the generated data validIn((ind-1)*fftLenSinFFT+1:upSamplingFac:fftLenSinFFT*ind) = true; end case 'AtEnd' % Zero padding at the end of input data samples for ind = 1:length(fftLenVecMulFFTs) % Generate data of FFT length samples randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind))); % Zero padded data dataIn(((ind-1)*fftLenSinFFT+1):((ind-1)*fftLenSinFFT+fftLenVecMulFFTs(ind))) = randInputData; % Valid corresponding to data generated validIn(((ind-1)*fftLenSinFFT+1):((ind-1)*fftLenSinFFT+fftLenVecMulFFTs(ind))) = true; end otherwise % Random for ind =1:length(fftLenVecMulFFTs) % Zero padding at random randIndices = randperm(fftLenSinFFT); % Generate data of FFT length samples randInputData = complex(randn(1,fftLenVecMulFFTs(ind)),randn(1,fftLenVecMulFFTs(ind))); indices = randIndices(1:fftLenVecMulFFTs(ind)); % If the random indices does not have the first sample if(sum(indices==1)==0) indices(1) = 1; end % Zero padded data dataIn(indices+(ind-1)*fftLenSinFFT) = randInputData; % Valid corresponding to data generated validIn(indices+(ind-1)*fftLenSinFFT) = true; end end
Прежде, чем запустить модель, убедитесь, что dataIn
, validIn
, fftLenIn
и необходимые переменные инициализируются.
sim(modelname);
dataOut1 = out1(:); dataOut2 = out2(:); figure; plot(abs(dataOut1-dataOut2)); title('Difference between the two outputs for arbitrary valid pattern') xlabel('Sample Index'); ylabel('Error'); bdclose(modelname);
Чтобы сгенерировать HDL-код, на который ссылаются в этом примере, лицензия HDL Coder™ необходима.
Можно использовать команды makehdl
и makehdltb
, чтобы сгенерировать HDL-код и испытательный стенд для подсистем.
HDL-код, сгенерированный для Переменных подсистем БПФ Размера, синтезировался для платы Xilinx® Zynq®-7000 ZC706. Результаты синтеза показывают в следующей таблице.
Приведенная выше таблица показывает, что реализация БПФ переменного размера с помощью одного БПФ использует гораздо меньше аппаратных ресурсов, чем использование решения для БПФ кратного. Чтобы поддержать произвольный вход допустимый шаблон, аппаратная реализация использует больше RAM.
bdclose(modelname);