主要内容

dsp。HDLIFFT

逆快速傅里叶变换 - 针对HDL代码生成进行了优化

描述

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

计算快速傅里叶反变换:

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

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

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

创建

描述

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

例子

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

例子:ifft128 = dsp.hdlifft('fftlength',128)

特性

展开全部

除非另有说明,否则属性是不宜,这意味着在调用对象后无法更改其值。当您调用它们时,对象锁定,以及释放函数打开它们。

如果属性是调节,您可以随时更改其值。

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

硬件实现,指定为:

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

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

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

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

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

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

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

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

  • 真正的- 输入通道元素处于比特反转顺序。

  • 错误的- 输入通道元素以线性顺序。

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

输出缩放,指定为:

  • 真正的- 对象实现整体1 /N.通过将每个蝴蝶乘法的输出除以2,通过2.此调整将IFFT的输出保持在与其输入相同的幅度范围内。

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

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

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

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

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

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

使用

描述

例子

[y验证] = ifft_n(Xvidinin的)返回快速傅里叶反变换(IFFT),y的输入,X,当vidinin真正的vidinin验证分别表示输入信号和输出信号的有效性的逻辑标量。

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

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

ifft_n = dsp.hdlifft.(___,“架构”“破灭基数2”);...[y,验证,准备好] = ifft_n(x,有效期)

[ystartOut终结验证] = ifft_n(Xvidinin的)也返回帧控制信号startOut终结startOut真正的输出数据帧的第一个样本。终结真正的为一帧输出数据的最后一个样本。

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

ifft_n = dsp.hdlifft.(___,'startoutputport',真的,'endoptputport',真正的);...[y, startOut, endOut, validOut] = IFFT_N (x, validIn)

[y验证] = ifft_n(XvidininresetIn的)返回IFFT,y,当vidinin真正的resetIn错误的.什么时候resetIn真正的,对象停止当前计算并清除所有内部状态。

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

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

[ystartOut终结验证] = ifft_n(XvidininresetIn的)返回IFFT,y,使用所有可选的控制信号。您可以使用可选端口语法的任意组合。

输入参数

展开全部

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

双倍的支持数据类型进行仿真,但不适用金宝app于HDL代码生成。

数据类型:FI.|int8|int16|INT32.|INT64.|uint8.|uint16|uint32||双倍的
复数支持:金宝app是的

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

数据类型:逻辑

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

数据类型:逻辑

输出参数

展开全部

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

指示对象具有可用于输入数据的内存,返回为逻辑标量。选择时返回此输出“破灭基数2”建筑学。使用此架构时,必须应用输入数据有效的信号只有当准备好了1(真正的)。该对象忽略任何输入数据有效的信号时准备好了0.(假)。有关显示此协议的波形,请参见时序图部分。

数据类型:逻辑

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

数据类型:逻辑

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

数据类型:逻辑

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

数据类型:逻辑

对象功能

要使用对象函数,请将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(循环),【验证(循环)] = hdlfft(复杂(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)'的单面幅度谱)包含('频率(Hz)') 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([“代表90%的FFT系数的数量”...'序列中的总能量', num2str(j)]) Yin = 0 (N,1);阴(我(1:j)) = Yf (i (1: j));
表示序列中总能量90%的FFT系数数:4

写一个创建和调用IFFT System Object™的函数。您可以从此功能生成HDL。

函数[yout,yankout] = hdlifft128(yin,有效期)%hdlifft128%使用dsp.hdlifft系统对象(TM)处理一个数据样本% yIn是一个定点标量或列向量。%VALIDIN是一个逻辑标量。%您可以从此功能生成HDL代码。执着的ifft128;如果ISEMPTY(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(循环),验证(循环)] = hdlifft128(复杂(0),false);结尾

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

xt = xt(vervout == 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 =零(v,loopcount);验证= false(v,loopcount);为了循环= 1:1:loopcount如果(mod(loop,N/V) == 0) i = N/V;其他的我= mod(循环,N / V);结尾[yf(:,循环),【验证(循环)] = hdlfft(复杂(y_vect(:,i)),(环<= n / v));结尾

绘制单面幅度谱。

c = yf(:,yankout == 1);yf_flat = c(:);YR = Bitrevorder(YF_FLAT);图(FS / 2 * LINSPACE(0,1,N / 2),2 * ABS(YR(1:N / 2)/ n))标题('噪声信号y(t)'的单面幅度谱)包含('频率(Hz)') ylabel (FFT (f)的输出的)

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

[ysort,i] = sort(abs(双(1:n))),1,“下降”);cumnergy = sqrt(umsum(ysort. ^ 2))/ rang(ysort);j = find(CumEnergy > 0.9, 1);DISP([“代表90%的FFT系数的数量”...'序列中的总能量', num2str(j)]) Yin = 0 (N,1);阴(我(1:j)) =年(i (1: j));YinVect =重塑(阴、V、N / V);
表示序列中总能量90%的FFT系数数:4

写一个创建和调用IFFT System Object™的函数。您可以从此功能生成HDL。

函数[yout,yantout] = hdlifft128v16(yin,有效期)% HDLFFT128V16%处理FFT数据的16个样本向量% yIn是不动点列向量。%VALIDIN是一个逻辑标量值。%您可以从此功能生成HDL代码。执着的ifft128v16;如果is空(ifft128v16) ifft128v16 = dsp。HDLIFFT (“FFTLength”,128)结尾[你,validOut] = ifft128v16(阴,validIn);结尾

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

xt =零(v,loopcount);验证= 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.normalize = true;l512n = getLatency(hdlifft)
L512n = 599

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

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

算法

展开全部

扩展功能

也可以看看

对象

介绍了R2014b