dsp.HDLIFFT

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

Описание

Система ОБПФ HDL object™ обеспечивает две архитектуры, чтобы оптимизировать или пропускную способность или область. Используйте Основание потоковой передачи 2^2 архитектура для высокопроизводительных приложений. Эта архитектура поддерживает скалярные или векторные входные данные. Можно достигнуть пропускной способности выборки гига сэмплов в секунду (GSPS) с помощью векторного входа. Используйте пакетное Основание 2 архитектуры для минимизации ресурса размещения, особенно с большими размерами БПФ. Ваша система должна смочь допустить принятие пульсирующих данных. Эта архитектура поддерживает только скалярные входные данные. Объект принимает действительные или комплексные данные, обеспечивает благоприятные для оборудования управляющие сигналы и имеет дополнительные выходные сигналы управления кадром.

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

  1. Создайте dsp.HDLIFFT объект и набор его свойства.

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?

Создание

Описание

IFFT_N = dsp.HDLIFFT возвращает Системный объект ОБПФ HDL, IFFT_N, это выполняет быстрое преобразование Фурье.

пример

IFFT_N = dsp.HDLIFFT(Name,Value) свойства наборов с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки.

Пример: ifft128 = dsp.HDLIFFT('FFTLength',128)

Свойства

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

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

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

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Аппаратная реализация в виде также:

  • 'Streaming Radix 2^2' — Архитектура низкой задержки. Пропускная способность выборки гига сэмплов в секунду (GSPS) поддержек, когда вы используете векторный вход.

  • 'Burst Radix 2'— Минимальная архитектура ресурса. Векторный вход не поддерживается, когда вы выбираете эту архитектуру. Когда вы используете эту архитектуру, ваши входные данные должны выполнить ready сигнал противодавления. Для формы волны, которая показывает этот протокол, см. третью схему в разделе Timing Diagram.

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

Порядок выходных данных в виде также:

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

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

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

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

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

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

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

Выведите масштабирование в виде также:

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

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

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

Включите reset входной параметр к объекту. Когда reset true, объект останавливает вычисление и очищает все внутреннее состояние.

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

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

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

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

Описание

пример

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

[Y,validOut,ready] = IFFT_N(X,validIn) возвращает обратное быстрое преобразование Фурье (ОБПФ) при использовании пакетного Основания 2 архитектуры. ready сигнал указывает, когда объект имеет память в наличии, чтобы принять новые входные выборки. Необходимо применить вход data и valid сигналы только, когда ready 1 TRUE. Объект игнорирует вход data и valid сигналы, когда ready 0 ложь.

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

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

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

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

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

[Y,validOut] = IFFT_N(X,validIn,resetIn) возвращает ОБПФ, Y, когда validIn true и resetIn false. Когда resetIn true, объект останавливает текущее вычисление и очищает все внутреннее состояние.

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

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

[Y,startOut,endOut,validOut] = IFFT_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
Поддержка комплексного числа: Да

Валидность входных данных в виде логического скаляра.

Типы данных: логический

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

Типы данных: логический

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

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

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

Индикация, что объект имеет память в наличии для входных данных, возвратилась как логический скаляр. Этот выходной параметр возвращен, когда вы выбираете 'Burst Radix 2' архитектура. Когда вы используете эту архитектуру, необходимо применить вход data и valid сигналы только, когда ready 1 TRUE. Объект игнорирует любой вход data и valid сигналы, когда ready 0 ложь. Для формы волны, которая показывает этот протокол, см. третью схему в разделе Timing Diagram.

Типы данных: логический

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

Типы данных: логический

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

Типы данных: логический

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

Типы данных: логический

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

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

release(obj)

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

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

Примеры

свернуть все

Создайте технические требования и входной сигнал. Этот пример использует БПФ с 128 точками.

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,16);
noOp = zeros(1,'like',y_fixed);

Вычислите БПФ сигнала использовать в качестве входа к объекту IFFT.

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

hdlfft = dsp.HDLFFT('FFTLength',N,'BitReversedOutput',false);
Yf = zeros(1,4*N);
validOut = false(1,4*N);
for loop = 1:1:N
   	  [Yf(loop),validOut(loop)] = hdlfft(complex(y_fixed(loop)),true);
end
for loop = N+1:1:4*N
	  [Yf(loop),validOut(loop)] = hdlfft(complex(noOp),false);
end
Yf = Yf(validOut == 1);

Постройте односторонний амплитудный спектр.

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

Выберите частоты, которые содержат большинство энергии в сигнале. cumsum функция не принимает аргументы фиксированной точки, поэтому преобразует данные назад в double.

[Ysort,i] = sort(abs(double(transpose(Yf(1:N)))),1,'descend');
Ysort_d = double(Ysort);
CumEnergy = sqrt(cumsum(Ysort_d.^2))/norm(Ysort_d);
j = find(CumEnergy > 0.9, 1);
     disp(['Number of FFT coefficients that represent 90% of the ', ...
     'total energy in the sequence: ', num2str(j)])
Yin = zeros(N,1);
Yin(i(1:j)) = Yf(i(1:j));
Number of FFT coefficients that represent 90% of the total energy in the sequence: 4

Запишите функцию, которая создает и вызывает Систему ОБПФ object™. Можно сгенерировать HDL от этой функции.

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

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


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

Xt = zeros(1,3*N);
validOut = false(1,3*N);
for loop = 1:1:N
    [Xt(loop),validOut(loop)] = HDLIFFT128(complex(Yin(loop)),true);
end
for loop = N+1:1:3*N
    [Xt(loop),validOut(loop)] = HDLIFFT128(complex(0),false);
end

Отбросьте недопустимые выходные выборки. Затем смотрите выход и сравните его с входным сигналом. Исходный вход находится в зеленом.

Xt = Xt(validOut==1);
Xt = bitrevorder(Xt);
norm(x-transpose(Xt(1:N)))
figure
stem(real(Xt))
figure
stem(real(x),'--g')
ans =

    0.7863

Создайте технические требования и входной сигнал. Этот пример использует БПФ с 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);

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

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

hdlfft = dsp.HDLFFT('FFTLength',N);
loopCount = getLatency(hdlfft,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)] = hdlfft(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)')

Выберите частоты, которые содержат большинство энергии в сигнале. cumsum функция не принимает аргументы фиксированной точки, поэтому преобразует данные назад в double.

[Ysort,i] = sort(abs(double(Yr(1:N))),1,'descend');
CumEnergy = sqrt(cumsum(Ysort.^2))/norm(Ysort);
j = find(CumEnergy > 0.9, 1);
     disp(['Number of FFT coefficients that represent 90% of the ', ...
     'total energy in the sequence: ', num2str(j)])
Yin = zeros(N,1);
Yin(i(1:j)) = Yr(i(1:j));
YinVect = reshape(Yin,V,N/V);
Number of FFT coefficients that represent 90% of the total energy in the sequence: 4

Запишите функцию, которая создает и вызывает Систему ОБПФ object™. Можно сгенерировать HDL от этой функции.

function [yOut,validOut] = HDLIFFT128V16(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 ifft128v16;
  if isempty(ifft128v16)
    ifft128v16 = dsp.HDLIFFT('FFTLength',128)
  end    
  [yOut,validOut] = ifft128v16(yIn,validIn);
end


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

Xt = 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
 	  [Xt(:,loop),validOut(loop)] = HDLIFFT128V16(complex(YinVect(:,i)),(loop<=N/V));
end
ifft128v16 = 

  dsp.HDLIFFT with properties:

                FFTLength: 128
             Architecture: 'Streaming Radix 2^2'
    ComplexMultiplication: 'Use 4 multipliers and 2 adders'
        BitReversedOutput: true
         BitReversedInput: false
                Normalize: true

  Use get to show all properties

Отбросьте недопустимые выходные выборки. Затем смотрите выход и сравните его с входным сигналом. Исходный вход находится в зеленом.

C = Xt(:,validOut==1);
Xt = C(:);
Xt = bitrevorder(Xt);
norm(x-Xt(1:N))
figure
stem(real(Xt))
figure
stem(real(x),'--g')
ans =

    0.7863

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

Создайте новый dsp.HDLIFFT возразите и запросите задержку.

hdlifft = dsp.HDLIFFT('FFTLength',512);
L512 = getLatency(hdlifft)
L512 = 599

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

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

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

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

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

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

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

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

Алгоритмы

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

Расширенные возможности

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

Объекты

Блоки

Введенный в R2014b