exponenta event banner

dsp. HDLFFT

Быстрое преобразование Фурье - оптимизировано для генерации кода HDL

Описание

HDL FFT System object™ предоставляет две архитектуры для оптимизации пропускной способности или области. Используйте потоковую архитектуру Radix 2 ^ 2 для высокопроизводительных приложений. Эта архитектура поддерживает скалярные или векторные входные данные. С помощью векторного ввода можно достичь пропускной способности giga-sample-per-second (GSPS). Используйте пакетную архитектуру Radix 2 для минимальной реализации ресурсов, особенно с большими размерами FFT. Система должна быть в состоянии выдерживать пакетные данные и более высокую задержку. Эта архитектура поддерживает только скалярные входные данные. Объект принимает реальные или сложные данные, обеспечивает аппаратные управляющие сигналы и имеет дополнительные выходные управляющие сигналы кадра.

Для вычисления быстрого преобразования Фурье:

  1. Создать dsp.HDLFFT и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

FFT_N = dsp.HDLFFT возвращает объект HDL FFT System, FFT_N, который выполняет быстрое преобразование Фурье.

пример

FFT_N = dsp.HDLFFT(Name,Value) задает свойства, используя одну или несколько пар имя-значение. Заключите каждое имя свойства в отдельные кавычки.

Пример: fft128 = dsp.HDLFFT('FFTLength',128)

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Аппаратная реализация, указанная как:

  • 'Streaming Radix 2^2' - Архитектура с низкой задержкой. Поддерживает пропускную способность giga-sample-per-second (GSPS) при использовании векторного ввода.

  • 'Burst Radix 2'- Минимальная архитектура ресурсов. При выборе этой архитектуры векторный ввод не поддерживается.

Внедрение ЛПВП комплексных множителей, указанных как 'Use 4 multipliers and 2 adders' или 'Use 3 multipliers and 5 adders'. В зависимости от вашего инструмента синтеза и целевого устройства, один вариант может быть быстрее или меньше.

Порядок выходных данных:

  • true - Элементы выходного канала преобразуются в биты относительно порядка ввода.

  • false - Элементы выходного канала расположены в линейном порядке.

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

Ожидаемый порядок входных данных:

  • true - Входные канальные элементы находятся в обратном битовом порядке.

  • false - Входные канальные элементы расположены в линейном порядке.

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

Масштаб вывода, указанный как:

  • true - объект реализует общий масштабный коэффициент 1/N, деля выходной сигнал каждого умножения бабочек на 2. Эта регулировка поддерживает выход БПФ в том же диапазоне амплитуд, что и его вход.

  • false - Объект избегает переполнения, увеличивая длину слова на один бит после каждого умножения бабочки. Рост битов одинаков для обеих архитектур.

Количество точек данных, используемых для одного вычисления БПФ, указанное как целочисленная степень 2 между 23 и 216. Объект принимает длины FFT за пределами этого диапазона, но они не поддерживаются для генерации кода HDL.

Позволить reset входной аргумент объекта. Когда reset является trueобъект останавливает вычисление и очищает все внутренние состояния.

Позволить startOut выходной аргумент объекта. Если включено, объект возвращает дополнительный выходной сигнал, который является true в первом цикле каждого допустимого выходного кадра.

Позволить endOut выходной аргумент объекта. Если включено, объект возвращает дополнительный выходной сигнал, который является true в первом цикле каждого допустимого выходного кадра.

Режим округления, используемый для операций с фиксированной точкой. Если входным значением является целое число или тип данных с фиксированной точкой, алгоритм БПФ использует арифметику с фиксированной точкой для внутренних вычислений. Этот параметр не применяется, если вход одно- или двухтипный. Округление применяется к операциям умножения и масштабирования сдвоенного коэффициента.

Использование

Описание

пример

[Y,validOut] = FFT_N(X,validIn) возвращает БПФ, Y, входного сигнала, X, когда validIn является true. validIn и validOut являются логическими скалярами, которые указывают на достоверность входного и выходного сигналов соответственно.

[Y,validOut,ready] = FFT_N(X,validIn) возвращает быстрое преобразование Фурье (FFT) при использовании пакетной архитектуры Radix 2. ready сигнал указывает, когда объект может принимать входные выборки.

Чтобы использовать этот синтаксис, задайте для свойства Architecture значение 'Burst Radix 2'. Например:

FFT_N = dsp.HDLFFT(___,'Architecture','Burst Radix 2');
...
[y,validOut,ready] = FFT_N(x,validIn)

[Y,startOut,endOut,validOut] = FFT_N(X,validIn) также возвращает сигналы управления кадрами startOut и endOut. startOut является true на первом образце кадра выходных данных. endOut является true для последней выборки кадра выходных данных.

Чтобы использовать этот синтаксис, задайте для свойств StartOutputPort и EndOutputPort значение true. Например:

FFT_N = dsp.HDLFFT(___,'StartOutputPort',true,'EndOutputPort',true);
...
[y,startOut,endOut,validOut] = FFT_N(x,validIn)

[Y,validOut] = FFT_N(X,validIn,resetIn) возвращает FFT, когда validIn является true и resetIn является false. Когда resetIn является trueобъект останавливает текущий расчет и очищает все внутренние состояния.

Чтобы использовать этот синтаксис, задайте для свойства ResetInputPort значение true. Например:

FFT_N = dsp.HDLFFT(___,'ResetInputPort',true);
...
[y,validOut] = FFT_N(x,validIn,resetIn)

[Y,startOut,endOut,validOut] = FFT_N(X,validIn,resetIn) возвращает БПФ, Y, используя все дополнительные управляющие сигналы. Можно использовать любую комбинацию дополнительных синтаксисов портов.

Входные аргументы

развернуть все

Входные данные, заданные как скалярный или столбчатый вектор вещественных или комплексных значений в формате с фиксированной точкой или целым числом. Векторный ввод поддерживается с помощью 'Streaming Radix 2^2' только архитектура. Размер вектора должен быть степенью 2 от 1 до 64 и не превышать длину БПФ.

double и single типы данных поддерживаются для моделирования, но не для генерации кода HDL.

Типы данных: fi | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | single | double
Поддержка комплексного номера: Да

Достоверность входных данных, указанных как логический скаляр.

Типы данных: logical

Сброс внутреннего состояния, заданного как логический скаляр. Чтобы включить этот аргумент, задайте для свойства ResetInputPort значение true.

Типы данных: logical

Выходные аргументы

развернуть все

Выходные данные, возвращаемые в виде скалярного или столбцового вектора вещественных или комплексных значений. Формат вывода соответствует формату входных данных.

Указывает, что объект имеет память, доступную для входных данных, возвращаемую как логический скаляр. Эти выходные данные возвращаются при выборе 'Burst Radix 2' архитектура.

Типы данных: logical

Первая выборка выходного кадра, возвращаемого как логический скаляр. Чтобы включить этот аргумент, задайте для свойства StartOutputPort значение true.

Типы данных: logical

Последняя выборка выходного кадра, возвращаемого как логический скаляр. Чтобы включить этот аргумент, задайте для свойства EndOutputPort значение true.

Типы данных: logical

Достоверность выходных данных, возвращаемых как логический скаляр.

Типы данных: logical

Функции объекта

Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:

release(obj)

развернуть все

getLatencyЗадержка вычисления БПФ или каналообразователя
stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

Создайте спецификации и входной сигнал.

N = 128;
Fs = 40;
t = (0:N-1)'/Fs;
x = sin(2*pi*15*t) + 0.75*cos(2*pi*10*t);
y = x + .25*randn(size(x));
y_fixed = sfi(y,32,24);

Запишите функцию, которая создает и вызывает системный object™. Из этой функции можно создать ЛПВП.

Примечание.Синтаксис этого объекта выполняется только в R2016b или более поздних версиях. При использовании более ранней версии замените каждый вызов объекта эквивалентным step синтаксис. Например, заменить myObject(x) с step(myObject,x).

function [yOut,validOut] = HDLFFT128(yIn,validIn)
%HDLFFT128 
% Processes one sample of FFT data using the dsp.HDLFFT System object(TM)
% yIn is a fixed-point scalar or column vector. 
% validIn is a logical scalar value.
% You can generate HDL code from this function.

  persistent fft128;
  if isempty(fft128)
    fft128 = dsp.HDLFFT('FFTLength',128);
  end    
  [yOut,validOut] = fft128(yIn,validIn);
end


Вычислите БПФ, вызвав функцию для каждой выборки данных.

Yf = zeros(1,3*N);
validOut = false(1,3*N);
for loop = 1:1:3*N
    if (mod(loop, N) == 0)
        i = N;
    else
        i = mod(loop, N);
    end
    [Yf(loop),validOut(loop)] = HDLFFT128(complex(y_fixed(i)),(loop <= N));
end

Отменить недопустимые выборки данных. Затем постройте график результатов частотного канала из БПФ.

Yf = Yf(validOut == 1);
Yr =  bitrevorder(Yf);
plot(Fs/2*linspace(0,1,N/2), 2*abs(Yr(1:N/2)/N))
title('Single-Sided Amplitude Spectrum of Noisy Signal y(t)')
xlabel('Frequency (Hz)')
ylabel('Output of FFT (f)')

Создание спецификаций и входного сигнала. В этом примере используется 128-точечный БПФ и одновременно вычисляется преобразование по 16 выборкам.

N = 128;
V = 16;
Fs = 40;
t = (0:N-1)'/Fs;
x = sin(2*pi*15*t) + 0.75*cos(2*pi*10*t);
y = x + .25*randn(size(x));
y_fixed = sfi(y,32,24);
y_vect = reshape(y_fixed,V,N/V);

Запишите функцию, которая создает и вызывает системный object™. Функция не должна знать размер вектора. Объект сохраняет размер входного сигнала при первом вызове.

Примечание.Синтаксис этого объекта выполняется только в R2016b или более поздних версиях. При использовании более ранней версии замените каждый вызов объекта эквивалентным step синтаксис. Например, заменить myObject(x) с step(myObject,x).

function [yOut,validOut] = HDLFFT128V16(yIn,validIn)
%HDLFFT128V16 
% Processes 16-sample vectors of FFT data 
% yIn is a fixed-point column vector. 
% validIn is a logical scalar value.
% You can generate HDL code from this function.

  persistent fft128v16;
  if isempty(fft128v16)
    fft128v16 = dsp.HDLFFT('FFTLength',128);
  end    
  [yOut,validOut] = fft128v16(yIn,validIn);
end


Вычислите БПФ, передав объекту 16-элементные векторы. Используйте getLatency функция для определения того, когда будет готова первая выборка выходных данных. Затем добавьте длину кадра, чтобы определить, сколько раз вызывать объект. Поскольку переменная объекта находится внутри функции, используйте второй объект для вызова getLatency. Используйте счетчик цикла для разворота validIn кому false после N входных выборок.

tempfft = dsp.HDLFFT;
loopCount = getLatency(tempfft,N,V)+N/V;
Yf = zeros(V,loopCount);
validOut = false(V,loopCount);
for loop = 1:1:loopCount
    if ( mod(loop,N/V) == 0 )
        i = N/V;
    else
        i = mod(loop,N/V);
    end
    [Yf(:,loop),validOut(loop)] = HDLFFT128V16(complex(y_vect(:,i)),(loop<=N/V));
end

Отменить недопустимые выходные выборки.

C = Yf(:,validOut==1);
Yf_flat = C(:);

Постройте график данных частотного канала из БПФ. Выход БПФ выполнен в битовом порядке. Измените порядок перед построением графика.

Yr =  bitrevorder(Yf_flat);
plot(Fs/2*linspace(0,1,N/2),2*abs(Yr(1:N/2)/N))
title('Single-Sided Amplitude Spectrum of Noisy Signal y(t)')
xlabel('Frequency (Hz)')
ylabel('Output of FFT (f)')

Задержка объекта зависит от длины БПФ и размера вектора. Используйте getLatency для поиска задержки конкретной конфигурации. Задержка - это количество циклов между первым действительным входом и первым действительным выходом, предполагая, что вход является непрерывным.

Создание нового dsp.HDLFFT и запросить задержку.

hdlfft = dsp.HDLFFT('FFTLength',512);
L512 = getLatency(hdlfft)
L512 = 599

Запрос информации о гипотетической задержке для аналогичного объекта с другой длиной БПФ. Свойства исходного объекта не изменяются.

L256 = getLatency(hdlfft,256)
L256 = 329
N = hdlfft.FFTLength
N = 512

Запрос информации о гипотетической задержке аналогичного объекта, который принимает ввод вектора из восьми выборок.

L256v8 = getLatency(hdlfft,256,8)
L256v8 = 93

Разрешить масштабирование на каждом этапе БПФ. Задержка не изменяется.

hdlfft.Normalize = true;
L512n = getLatency(hdlfft)
L512n = 599

Запросите тот же порядок вывода, что и порядок ввода. Задержка увеличивается, поскольку объект должен собрать выходные данные перед переупорядочиванием.

hdlfft.BitReversedOutput = false;
L512r = getLatency(hdlfft)
L512r = 1078

Алгоритмы

развернуть все

2
Представлен в R2014b