主要内容

dsp。HDLIFFT

反快速傅里叶变换-为HDL代码生成优化

描述

HDL IFFT System对象™提供了两种架构来优化吞吐量或区域。为高吞吐量的应用程序使用流基数2^2架构。该体系结构支持标量或矢量输入数据。金宝app您可以使用矢量输入来实现每秒千兆采样(GSPS)吞吐量。使用突发基数2架构来实现最小的资源,特别是在FFT规模较大的情况下。您的系统必须能够容忍突发数据和更高的延迟。此体系结构仅支持标量输入数据。金宝app该对象接受真实或复杂的数据,提供硬件友好的控制信号,并具有可选的输出帧控制信号。

计算快速傅里叶反变换:

  1. 创建dsp。HDLIFFT对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

创建

描述

IFFT_N= dsp。HDLIFFT返回一个HDL IFFT系统对象,IFFT_N,进行快速傅里叶变换。

例子

IFFT_N= dsp.HDLIFFT(名称,值)使用一个或多个名称-值对设置属性。将每个属性名用单引号括起来。

例子:ifft128 = dsp.HDLIFFT (' FFTLength ', 128)

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

硬件实现,指定为:

  • “流基数2 ^ 2”——低延迟架构。金宝app当您使用矢量输入时,支持每秒giga采样(GSPS)吞吐量。

  • “破灭基数2”—最小资源架构。选择此架构时不支持向量输入。金宝app使用此体系结构时,输入数据必须符合准备好了反压力信号。有关显示此协议的波形,请参见时间图部分。

复杂乘法器的HDL实现,指定为使用4个乘法器和2个加法器使用3个乘法器和5个加法器.根据您的合成工具和目标设备,一种选择可能更快或更小。

输出数据的顺序,指定为:

  • 真正的-输出通道元素相对于输入顺序位颠倒。

  • —输出通道元素为线性顺序。

IFFT算法以与输入相反的顺序计算输出。当您以与输入相同的顺序请求输出时,算法将执行一个额外的反转操作。有关输出顺序的更多信息,请参见线性和位反输出顺序

输入数据的预期顺序,指定为:

  • 真正的—输入通道元素的顺序是倒序的。

  • —输入通道元素按线性顺序排列。

IFFT算法以与输入相反的顺序计算输出。当您以与输入相同的顺序请求输出时,算法将执行一个额外的反转操作。有关输出顺序的更多信息,请参见线性和位反输出顺序

输出缩放,指定为:

  • 真正的-对象实现了一个整体的1/N将每只蝴蝶的输出除以2。这个调整保持IFFT的输出在其输入的相同幅度范围。

  • 该对象通过在每次蝴蝶乘法后增加一个字符长度来避免溢出。这两种架构的位增长是相同的。

用于一次FFT计算的数据点数,指定为2之间的2的整数次幂3.和216.对象接受超出此范围的FFT长度,但它们不支持HDL代码生成。金宝app

启用重置对象的输入参数。当重置真正的时,对象停止计算并清除所有内部状态。

启用startOut对象的输出参数。当启用时,对象返回一个额外的输出信号,即真正的在每个有效输出帧的第一个循环中。

启用endOut对象的输出参数。当启用时,对象返回一个额外的输出信号,即真正的在每个有效输出帧的第一个循环中。

舍入模式用于定点操作。当输入是任何整数或定点数据类型时,IFFT算法使用定点算法进行内部计算。当输入是单类型或双类型时,此选项不适用。四舍五入适用于旋转因子乘法和缩放操作。

使用

描述

例子

YvalidOut) = IFFT_N (XvalidIn返回快速傅里叶反变换(IFFT),Y的输入,X,当validIn真正的validInvalidOut分别表示输入信号和输出信号的有效性的逻辑标量。

YvalidOut准备好了) = IFFT_N (XvalidIn当使用突发基数2架构时返回快速傅里叶反变换(IFFT)。的准备好了信号表示对象何时有可用的内存来接受新的输入样本。你必须应用输入数据有效的信号只有当准备好了1(真正的)。对象忽略输入数据有效的信号时准备好了0(假)。

要使用此语法,请设置体系结构财产“破灭基数2”.例如:

IFFT_N = dsp。HDLIFFT (___,“架构”“破灭基数2”);...[y, validOut,准备]= IFFT_N (x, validIn)

YstartOutendOutvalidOut) = IFFT_N (XvalidIn也返回帧控制信号startOutendOutstartOut真正的输出数据帧的第一个样本。endOut真正的为一帧输出数据的最后一个样本。

要使用此语法,请设置StartOutputPortEndOutputPort属性真正的.例如:

IFFT_N = dsp。HDLIFFT (___,“StartOutputPort”,真的,“EndOutputPort”,真正的);...[y, startOut, endOut, validOut] = IFFT_N (x, validIn)

YvalidOut) = IFFT_N (XvalidInresetIn返回传输线,Y,当validIn真正的resetIn.当resetIn真正的,该对象将停止当前计算并清除所有内部状态。

要使用此语法,请设置ResetInputPort财产真正的.例如:

IFFT_N = dsp。HDLIFFT (___,“ResetInputPort”,真正的);...[y, validOut] = IFFT_N (x, validIn resetIn)

YstartOutendOutvalidOut) = IFFT_N (XvalidInresetIn返回传输线,Y,使用所有可选的控制信号。您可以使用可选端口语法的任意组合。

输入参数

全部展开

以定点或整数格式指定为实值或复数值的标量或列向量的输入数据。支持向量输入金宝app“流基数2 ^ 2”体系结构。向量大小必须是1到64之间的2的幂,且不大于FFT长度。

模拟支持数据类型,但不支持HD金宝appL代码生成。

数据类型:fi|int8|int16|int32|int64|uint8|uint16|uint32||
复数的支持:金宝app是的

输入数据的有效性,指定为逻辑标量。

数据类型:逻辑

重置指定为逻辑标量的内部状态。要启用此参数,请设置ResetInputPort财产真正的

数据类型:逻辑

输出参数

全部展开

输出数据,作为实值或复数值的标量或列向量返回。输出格式与输入数据的格式相匹配。

表示对象具有可用于输入数据的内存,该数据以逻辑标量的形式返回。当您选择时将返回此输出“破灭基数2”体系结构。当您使用这个体系结构时,您必须应用输入数据有效的信号只有当准备好了1(真正的)。该对象忽略任何输入数据有效的信号时准备好了0(假)。有关显示此协议的波形,请参见时间图部分。

数据类型:逻辑

输出帧的第一个样本,作为逻辑标量返回。要启用此参数,请设置StartOutputPort财产真正的

数据类型:逻辑

输出帧的最后一个样本,作为逻辑标量返回。要启用此参数,请设置EndOutputPort财产真正的

数据类型:逻辑

作为逻辑标量返回的输出数据的有效性。

数据类型:逻辑

对象的功能

要使用对象函数,请指定System对象作为第一个输入参数。例如,释放名为system的对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

getLatency FFT或信道化计算的延迟
一步 运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 使内部状态复位系统对象

例子

全部折叠

创建规格和输入信号。本例使用128点FFT。

N = 128;Fs = 40;t = (0: n - 1) / Fs;X = sin2 *15*t + 0.75*cos(2* 10*t);Y = x + .25*randn(size(x));y_fixed = sfi (y, 32岁,16);等待= 0 (1,“喜欢”, y_fixed);

计算信号的FFT作为IFFT对象的输入。

注意:该对象语法仅在R2016b或更高版本中运行。如果您正在使用较早的版本,请将对象的每个调用替换为等价的一步语法。例如,替换myObject (x)步骤(myObject x)

hdlfft = dsp。HDLFFT (“FFTLength”N“BitReversedOutput”、假);Yf = 0 (1, 4 * N);validOut = false (1, 4 * N);循环= 1:1:N [Yf(循环),validOut(循环)]= hdlfft(complex(y_fixed(循环)),true);结束循环= N+1:1:4*N [Yf(循环),validOut(循环)]= hdlfft(complex(noOp),false);结束Yf = Yf(validOut == 1);

绘制单边振幅谱。

情节(Fs / 2 * linspace (0, 1, N / 2), 2 * abs (Yf (1: N / 2) / N))标题(“噪声信号y(t)的单边幅度谱”)包含(的频率(赫兹)) ylabel (FFT (f)输出

选择在信号中保持大部分能量的频率。的cumsum函数不接受定点参数,因此将数据转换回

[Ysort,我]=排序(abs(双(转置(Yf (1: N)))), 1,“下”);Ysort_d =双(Ysort);CumEnergy =√cumsum Ysort_d。^ 2))/规范(Ysort_d);j = find(CumEnergy > 0.9, 1);disp ([“FFT系数的数量,代表90%的”...'序列中的总能量', num2str(j)]) Yin = 0 (N,1);阴(我(1:j)) = Yf (i (1: j));
表示序列中总能量90%的FFT系数数:4

编写一个创建和调用IFFT System对象™的函数。您可以从这个函数生成HDL。

函数[你,validOut] = HDLIFFT128(阴、validIn)% HDLIFFT128%使用dsp处理一个数据样本。HDLIFFT系统对象(TM)% yIn是一个定点标量或列向量。% validIn是一个逻辑标量。你可以从这个函数生成HDL代码。持续的ifft128;如果is空(ifft128) ifft128 = dsp。HDLIFFT (“FFTLength”, 128);结束[你,validOut] = ifft128(阴,validIn);结束

通过为每个数据样本调用函数来计算IFFT。

Xt = 0 (1,3 * N);validOut = false (1, 3 * N);循环= 1:1:N [Xt(循环),validOut(循环)]= HDLIFFT128(complex(Yin(循环)),true);结束循环= N+1:1:3*N [Xt(loop),validOut(loop)] = HDLIFFT128(complex(0),false);结束

丢弃无效的输出样本。然后检查输出并与输入信号进行比较。原始输入是绿色的。

Xt = Xt (validOut = = 1);Xt = bitrevorder (Xt);范数(x转置(Xt(1:N)))图杆(实(Xt))图杆(实(x))“——g”
ans = 0.7863

创建规格和输入信号。本例使用128点FFT,每次计算16个样本的变换。

N = 128;V = 16;Fs = 40;t = (0: n - 1) / Fs;X = sin2 *15*t + 0.75*cos(2* 10*t);Y = x + .25*randn(size(x));y_fixed = sfi (y, 32岁,24);y_vect =重塑(y_fixed、V、N / V);

计算信号的FFT,用作IFFT对象的输入。

注意:该对象语法仅在R2016b或更高版本中运行。如果您正在使用较早的版本,请将对象的每个调用替换为等价的一步语法。例如,替换myObject (x)步骤(myObject x)

hdlfft = dsp。HDLFFT (“FFTLength”N);loopCount = getLatency (hdlfft N V) + N / V;Yf = 0 (V, loopCount);validOut = false (V, loopCount);循环= 1:1:loopCount如果(mod(loop,N/V) == 0) i = N/V;其他的我= mod(循环,N / V);结束[Yf:循环),validOut(循环)]= hdlfft(复杂(y_vect(:,我)),(循环< = N / V));结束

绘制单边振幅谱。

C = Yf (:, validOut = = 1);Yf_flat = C (:);年= bitrevorder (Yf_flat);情节(Fs / 2 * linspace (0, 1, N / 2), 2 * abs(年(1:N / 2) / N))标题(“噪声信号y(t)的单边幅度谱”)包含(的频率(赫兹)) ylabel (FFT (f)的输出

选择在信号中保持大部分能量的频率。的cumsum函数不接受定点参数,因此将数据转换回

[Ysort,我]=排序(abs(双(年(1:N))), 1,“下”);CumEnergy =√cumsum Ysort。^ 2))/规范(Ysort);j = find(CumEnergy > 0.9, 1);disp ([“FFT系数的数量,代表90%的”...'序列中的总能量', num2str(j)]) Yin = 0 (N,1);阴(我(1:j)) =年(i (1: j));YinVect =重塑(阴、V、N / V);
表示序列中总能量90%的FFT系数数:4

编写一个创建和调用IFFT System对象™的函数。您可以从这个函数生成HDL。

函数[你,validOut] = HDLIFFT128V16(阴、validIn)% HDLFFT128V16%处理FFT数据的16个样本向量% yIn是不动点列向量。% validIn是一个逻辑标量值。你可以从这个函数生成HDL代码。持续的ifft128v16;如果is空(ifft128v16) ifft128v16 = dsp。HDLIFFT (“FFTLength”, 128)结束[你,validOut] = ifft128v16(阴,validIn);结束

通过为每个数据样本调用函数来计算IFFT。

Xt = 0 (V, loopCount);validOut = false (V, loopCount);循环= 1:1:loopCount如果(mod(loop,N/V) == 0) i = N/V;其他的我= mod(循环,N / V);结束(Xt(:,循环),validOut(循环)]= HDLIFFT128V16(复杂(YinVect(:,我)),(循环< = N / V));结束
ifft128v16 = dsp。HDLIFFT与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);范数(x-Xt(1:N))图杆(实(Xt))图杆(实(x))“——g”
ans = 0.7863

对象的延迟随FFT长度和矢量大小而变化。使用getLatency函数查找特定配置的延迟。延迟是第一个有效输入和第一个有效输出之间的周期数,假设输入是连续的。

创建一个新的dsp。HDLIFFT对象和请求延迟。

hdlifft = dsp。HDLIFFT (“FFTLength”, 512);L512 = getLatency (hdlifft)
L512 = 599

请求关于具有不同FFT长度的类似对象的假设延迟信息。原始对象的属性不会改变。当您没有指定向量长度时,该函数假定输入数据为标量。

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

请求接受8个样本向量输入的类似对象的假设延迟信息。

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

在IFFT的每个阶段启用缩放功能。延迟不会改变。

hdlifft。N或malize = true; L512n = getLatency(hdlifft)
L512n = 599

请求与输入顺序相同的输出顺序。此设置会增加延迟,因为对象必须在重新排序之前收集输出。

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

算法

全部展开

扩展功能

介绍了R2014b