В этом примере показано, как реализовать БПФ переменного размера с помощью одного ядра БПФ.
Этот пример включает две модели 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 и сравнены.
Подсистема верхнего уровня в обоих модели реализует БПФ переменного размера. Главная подсистема использует один блок 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 выполняется. Блок MATLAB function pickFFTData
выбирает выход из соответствующего блока FFT. Выход сохранен в MATLAB для сравнения с выходом БПФ Переменного Размера с помощью Одного БПФ.
open_system([modelname '/Multiple FFTs for Reference']);
Скрипт MATLAB конфигурирует желаемый вектор длин БПФ, размер одного БПФ, и генерирует входные данные с допустимым сигналом. Это затем запускает модель и сравнивает выход этих двух подсистем в MATLAB.
Запустите модель с помощью sim
команда на командной строке MATLAB.
sim(modelname);
Выход от обеих подсистем отправляется в рабочее пространство MATLAB, и различие построено. В этом случае, выход этих двух подсистем идентичны, и ошибка между этими двумя множествами значений 0.
dataOut1 = out1(:); dataOut2 = out2(:); figVSF = figure('Visible', 'off'); plot(abs(dataOut1-dataOut2)); title('Difference between the two outputs for fixed valid pattern') xlabel('Sample Index'); ylabel('Error'); figVSF.Visible = 'on'; 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(:); figVSFAIV = figure('Visible', 'off'); plot(abs(dataOut1-dataOut2)); title('Difference between the two outputs for arbitrary valid pattern') xlabel('Sample Index'); ylabel('Error'); figVSFAIV.Visible = 'on'; bdclose(modelname);
Чтобы сгенерировать HDL-код, на который ссылаются в этом примере, лицензия HDL Coder™ необходима.
Можно использовать команды makehdl
и makehdltb
сгенерировать HDL-код и испытательный стенд для подсистем.
HDL-код, сгенерированный для Переменных подсистем БПФ Размера, синтезировался для платы Xilinx® Zynq®-7000 ZC706. Результаты синтеза показывают в следующей таблице.
Приведенная выше таблица показывает, что реализация БПФ переменного размера с помощью одного БПФ использует меньше аппаратных ресурсов, чем использование решения для БПФ кратного. Чтобы поддержать произвольный вход допустимый шаблон, аппаратная реализация использует больше RAM.