dsp. HDLIFFT

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

Описание

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

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

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

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

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

Создание

Синтаксис

IFFT_N = dsp.HDLIFFT
IFFT_N = dsp.HDLIFFT(Name,Value)

Описание

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

пример

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

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

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

[Y,validOut] = IFFT_N(X,validIn)
[Y,validOut,ready] = IFFT_N(X,validIn)
[Y,startOut,endOut,validOut] = IFFT_N(X,validIn)
[Y,validOut] = IFFT_N(X,validIn,resetIn)
[Y,startOut,endOut,validOut] = IFFT_N(X,validIn,resetIn)

Описание

пример

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

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

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

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