exponenta event banner

dsp. HDLIFFT

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

Описание

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

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

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

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

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

Создание

Описание

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

пример

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

Пример: ifft128 = dsp.HDLIFFT('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 - Элементы выходного канала расположены в линейном порядке.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Описание

пример

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

[Y,validOut,ready] = IFFT_N(X,validIn) возвращает обратное быстрое преобразование Фурье (IFFT) при использовании пакетной архитектуры Radix 2. 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) возвращает IFFT, 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) возвращает IFFT, 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

Примеры

свернуть все

Создайте спецификации и входной сигнал. В этом примере используется 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™ IFFT. Из этой функции можно создать ЛПВП.

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


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

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™ IFFT. Из этой функции можно создать ЛПВП.

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


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

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