Реализация HDL БПФ Переменного Размера

Этот пример показывает, как реализовать БПФ переменного размера с помощью одного ядра БПФ.

Этот пример включает две модели 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']);

Запустите модель Simulink

Скрипт 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

Запустите модель Simulink

Прежде, чем запустить модель, убедитесь, что 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-код, на который ссылаются в этом примере, лицензия HDL Coder™ необходима.

Можно использовать команды makehdl и makehdltb, чтобы сгенерировать HDL-код и испытательный стенд для подсистем.

HDL-код, сгенерированный для Переменных подсистем БПФ Размера, синтезировался для платы Xilinx® Zynq®-7000 ZC706. Результаты синтеза показывают в следующей таблице.

Приведенная выше таблица показывает, что реализация БПФ переменного размера с помощью одного БПФ использует гораздо меньше аппаратных ресурсов, чем использование решения для БПФ кратного. Чтобы поддержать произвольный вход допустимый шаблон, аппаратная реализация использует больше RAM.

bdclose(modelname);

Смотрите также