dsp.HDLIFFT

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

Описание

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

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

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

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

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

Создание

Описание

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

пример

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

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

Свойства

расширить все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выход, заданное как:

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

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

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

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

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

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

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

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

Описание

пример

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

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

Чтобы использовать этот синтаксис, задайте значение свойства 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объект останавливает текущее вычисление и очищает все внутренние состояния.

Чтобы использовать этот синтаксис, задайте значение свойства ResetInportPort 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
Поддержка комплексного числа: Да

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

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

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

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

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

расширить все

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

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

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

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

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

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

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

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

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

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

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

release(obj)

расширить все

getLatencyЗадержка вычисления БПФ или канализатора
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);

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

Примечание.Синтаксис объекта выполняется только в 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)')

Выберите частоты, которые удерживают большую часть энергии в сигнале. The 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™ IFFT. Вы можете сгенерировать 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);

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

Примечание.Синтаксис объекта выполняется только в 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)')

Выберите частоты, которые удерживают большую часть энергии в сигнале. The 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™ IFFT. Вы можете сгенерировать 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

Включите масштабирование на каждом этапе IFFT. Задержка не меняется.

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

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

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

Алгоритмы

расширить все

2

См. также

Объекты

Блоки

Введенный в R2014b