exponenta event banner

Внедрение ЛПВП с переменным размером БПФ

В этом примере показано, как реализовать БПФ переменного размера с использованием одного ядра БПФ.

Этот пример включает в себя две модели VariiveStartFFTHETHexample и VariiveStartFFTArbitureValidPatternHEXample, которые показывают реализации FFT переменного размера для различных входных допустимых шаблонов.

Многие популярные стандарты, такие как WLAN, WiMax, digital video broadcast (DVB), digital audio broadcast (DAB) и LTE (долгосрочная эволюция), предоставляют множество вариантов пропускной способности. Требуемая длина БПФ для модуляции OFDM и демодуляции для этих стандартов изменяется в зависимости от варианта полосы пропускания. Например, LTE поддерживает различные варианты полосы пропускания канала от 1,4 МГц до 20 МГц, которые требуют длины БПФ от 128 до 2048 соответственно. Блок FFT HDL Optimized (DSP System Toolbox) генерирует код HDL для определенной длины FFT. В этом примере показано, как использовать блок FFT HDL Optimized для реализации FFT переменного размера.

Этот пример создает входные данные в MATLAB ® и импортирует их в Simulink ® для моделирования. Импортированные данные подаются в реализации БПФ переменного размера с использованием одного БПФ и нескольких БПФ. Чтобы продемонстрировать, что реализация с одним FFT соответствует результатам использования нескольких FFT различных размеров, оба выходных потока из симулятора Simulink экспортируются в MATLAB и сравниваются.

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

Подсистема верхнего уровня в обеих моделях реализует БПФ переменного размера. Верхняя подсистема использует один блок БПФ, а нижняя подсистема предоставляет опорные данные, используя несколько блоков БПФ различных размеров.

В примере модели VariiveStartFFTHETHENexample данные могут обрабатываться с промежутком между допустимыми выборками при условии, что этот промежуток зависит от длины БПФ.

modelname = 'VariableSizeFFTHDLExample';
open_system(modelname);

Конфигурация длин БПФ

Длины БПФ задаются с помощью переменной fftLenVecMulFFTs. Наибольшая из этих длин хранится в переменной fftLenSinFFT и используется в качестве длины БПФ для блока БПФ в '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 недействительных выборки для каждой действительной выборки.

Для примера модели VariiveStartFFTHETHENFample требуется, чтобы входной допустимый шаблон имел промежуток между допустимыми выборками, как показано на рисунке ниже.

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 сконфигурирован для длины FFT 2048, наибольшей длины FFT, требуемой стандартом LTE. Для упрощения выбора выходных ячеек блок БПФ выполнен с возможностью вывода выборок в бит-натуральном порядке. Длина БПФ задается через входной порт и выбирается в начале кадра. Запрошенная длина БПФ должна быть задержана, чтобы соответствовать задержке БПФ. Длина БПФ регистрируется с использованием начального выходного сигнала БПФ и сформированного конца сигнала кадра. Этот способ позволяет избежать реализации большой памяти, соответствующей задержке. Поскольку входные данные имеют нули между выборками, выходной сигнал большого БПФ содержит повторяющиеся копии выборок длины БПФ. Для получения требуемого выхода БПФ первые выборки длины БПФ собираются из выхода БПФ. Эта операция выполняется путем изменения выходного действительного сигнала БПФ с помощью Bin selection подсистема.

Несколько FFT для справки

Эта подсистема используется в качестве эталона для сравнения с выходом FFT переменного размера с использованием Single FFT. Подсистема включает в себя пять различных блоков БПФ (БПФ 128, БПФ 256, БПФ 512, БПФ 1024 и БПФ 2048) и один функциональный блок MATLAB. Входные данные будут переданы во все пять FFT. В зависимости от требуемой длины БПФ активируется один из пяти блоков БПФ и выполняется операция БПФ. Функциональный блок MATLAB pickFFTData выбирает выход из соответствующего блока БПФ. Выходные данные сохраняются в 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);

Поддержка произвольных допустимых шаблонов ввода

Приведенная выше модель VariiveStartFFTHENexample требует минимального зазора между выборками входных данных. Зазор зависит от заданной длины БПФ и наибольшей длины БПФ, обрабатываемой конструкцией. Могут быть случаи, когда входные данные могут не соответствовать этому шаблону. Например, данные могут быть непрерывными и заполняться нулями в конце выборок входных данных. На следующем рисунке показана непрерывная действительная схема ввода с недопустимыми выборками, дополненными в конце выборок входных данных для длин БПФ 256 и 512. Длина одного БПФ устанавливается равной 2048. В этом случае 256 действительных выборок следуют за 1792 недействительными выборками, а 512 действительных выборок следуют за 1536 недействительными выборками.

В таком сценарии конструкция должна сохранять входные выборки в ОЗУ и вставлять недопустимые выборки между действительными выборками перед отправкой их в БПФ. Пример модели VariiveStartFFTArbitrireValidPatternHEample может обрабатывать любой произвольный шаблон допустимого ввода, если промежуток между кадрами составляет по меньшей мере одну длину FFT (2048 выборок для LTE). Эта модель является той же, что и модель «VariiveStartFFTHENCample», за исключением подсистемы контроллера данных. Подсистема контроллера данных в модели использует ОЗУ размера 2*fftLenSinFFT (как показано на рисунке ниже) для хранения входных выборок считывает действительные выборки, заполняя их нулями и затем передавая их в БПФ. В то время как входные данные записываются в одну половину памяти, данные считываются из другой половины памяти. В результате общая задержка увеличивается на fftLenSinFFT.

modelname = 'VariableSizeFFTArbitraryValidPatternHDLExample';
load_system(modelname);
open_system([modelname '/Variable Size FFT using Single FFT/Data Controller']);

Произвольные входные данные и допустимая генерация

Для генерации произвольных данных и действительных входных данных пользователи могут выбрать любой из этих трех вариантов: нулевое заполнение фиксированного размера между выборками данных, нулевое заполнение в конце выборок данных и нулевое заполнение случайного размера между выборками данных. Входные данные и действительная генерация для этих трех различных шаблонов заполнения нулем показаны ниже. Example-модель VariiveStartFFTArbitrireValidPatternHEample использует созданные данные и действительна для моделирования и проверки.

% 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, сгенерированный для FFT-подсистем переменного размера, был синтезирован для платы Xilinx ® Zynq ® -7000 ZC706. Результаты синтеза представлены в следующей таблице.

Таблица выше показывает, что реализация БПФ переменного размера с использованием одного БПФ использует меньше аппаратных ресурсов, чем использование решения с несколькими БПФ. Для поддержки произвольного входного действительного шаблона аппаратная реализация использует больше ОЗУ.

См. также

(панель инструментов системы DSP)