Реализация 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 и сравнены.

Архитектура модели

Подсистема верхнего уровня в обоих модели реализует БПФ переменного размера. Главная подсистема использует один блок 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 МГц соответственно. Время символа для любой длины БПФ$66.67 \mu s$. Пример действует на самом высоком уровне среди заданных длин БПФ.

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']);

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

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

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

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

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

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

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

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

Для просмотра документации необходимо авторизоваться на сайте