主要内容

dsphdl。FFT

计算快速傅里叶变换(FFT)

描述

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

计算快速傅里叶变换:

  1. 创建dsphdl。FFT对象并设置其属性。

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

有关系统对象如何工作的详细信息,请参见什么是系统对象?

创建

描述

FFT_N= dsphdl。FFT返回一个HDL FFT系统对象,FFT_N,执行快速傅里叶变换。

例子

FFT_N= dsphdl。FFT (名称,值使用一个或多个名称-值对设置属性。将每个属性名用单引号括起来。

例子:fft128 = dsphdl.FFT('FFTLength',128)

属性

全部展开

除非另有说明,属性为nontunable,这意味着在调用对象后不能更改它们的值。对象在调用时锁定,而释放功能解锁它们。

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

有关更改属性值的详细信息,请参见使用系统对象的MATLAB系统设计

硬件实现,指定为:

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

  • 《爆裂的基数2》—最小资源架构。选择此体系结构时不支持矢量输入。金宝app使用此体系结构时,输入数据必须符合准备好了反压力信号。

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

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

  • 真正的输出通道元素相对于输入顺序是位反转的。

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

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

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

  • 真正的—输入通道元素按位反序排列。

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

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

输出缩放,指定为:

  • 真正的—对象整体实现1/N比例因子是将每只蝴蝶的输出再乘以2。这种调整使FFT的输出保持在与其输入相同的振幅范围内。

  • —对象通过在每次蝴蝶乘法后增加一位字长来避免溢出。对于这两种架构,比特增长是相同的。

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

启用重置对象的输入参数。当重置1(true),对象停止当前计算并清除内部状态。当重置0(false)和输入有效的1(true),对象捕获数据进行处理。

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

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

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

使用

描述

例子

Y,validOut= fft_n (X,validIn返回FFT,Y的输入,X,当validIn真正的validIn而且validOut分别表示输入和输出信号有效性的逻辑标量。

Y,validOut,准备好了= fft_n (X,validIn当使用突发Radix 2架构时,返回快速傅里叶变换(FFT)。的准备好了信号指示对象何时有内存可供新的输入样本使用。必须应用输入数据而且有效的信号只在准备好了1(真正的)。对象忽略任何输入数据而且有效的信号时准备好了0(假)。

要使用此语法,请设置体系结构财产《爆裂的基数2》.例如:

FFT_N = dsphdl。FFT (___,“架构”,《爆裂的基数2》);...[y,validOut,ready] = FFT_N(x,validIn)

Y,startOut,endOut,validOut= fft_n (X,validIn还返回帧控制信号startOut而且endOutstartOut真正的在输出数据帧的第一个样本上。endOut真正的对于一帧输出数据的最后一个示例。

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

FFT_N = dsphdl。FFT (___,“StartOutputPort”,真的,“EndOutputPort”,真正的);...[y,startOut,endOut,validOut] = FFT_N(x,validIn)

Y,validOut= fft_n (X,validIn,resetIn时返回FFTvalidIn真正的而且resetIn.当resetIn真正的,该对象停止当前计算并清除所有内部状态。

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

FFT_N = dsphdl。FFT (___,“ResetInputPort”,真正的);...[y,validOut] = FFT_N(x,validIn,resetIn)

Y,startOut,endOut,validOut= fft_n (X,validIn,resetIn返回FFT,Y,使用所有可选控制信号。您可以使用可选端口语法的任意组合。

输入参数

全部展开

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

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

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

指示输入数据是否有效的控制信号。当validIn1真正的),该对象从dataIn论点。当validIn0的值,该对象将忽略dataIn论点。

数据类型:逻辑

清除内部状态的控制信号。当重置1真正的),对象停止当前计算并清除内部状态。当重置0)和输入有效的1真正的),该块捕获数据进行处理。

有关更多重置注意事项,请参见复位信号章节硬件控制信号页面。

依赖关系

要启用此参数,请设置ResetInputPort真正的

数据类型:逻辑

输出参数

全部展开

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

指示对象已准备好在下一个周期进行新的输入数据采样的控制信号。当准备好了1真正的),则可指定数据而且有效的下一个时间步骤的输入。当准备好了0),对象将忽略下一个时间步骤中的任何输入数据。选择时返回此输出《爆裂的基数2》体系结构。

数据类型:逻辑

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

数据类型:逻辑

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

数据类型:逻辑

指示输出数据是否有效的控制信号。当validOut1真正的对象返回有效的数据dataOut论点。当validOut0的值dataOut论点无效。

数据类型:逻辑

对象的功能

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

发行版(obj)

全部展开

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

例子

全部折叠

创建规格并输入信号。

N = 128;Fs = 40;t = (0:N-1)'/Fs;X = sin(2* *15*t) + 0.75*cos(2* *10*t);Y = x + .25*randn(size(x));Y_fixed = sfi(y,32,24);

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

函数[yOut,validOut] = HDLFFT128(yIn,validIn)% HDLFFT128使用dsphdl处理一个FFT数据样本。系统对象(TM)yIn是一个定点标量或列向量。% validIn是一个逻辑标量值。您可以从这个函数生成HDL代码。持续的fft128;如果Isempty (fft128) fft128 = dsphdl。FFT (“FFTLength”, 128);结束[yOut,validOut] = fft128(yIn,validIn);结束

通过调用每个数据样本的函数来计算FFT。

Yf = 0 (1,3*N);validOut = false(1,3*N);循环= 1:1:3*N如果(mod(循环,N) == 0) i = N;其他的i = mod(循环,N);结束[Yf(循环),validOut(循环)]= HDLFFT128(complex(y_fixed(i)),(循环<= N));结束

丢弃无效的数据样本。然后绘制FFT的频率通道结果。

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

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

N = 128;V = 16;Fs = 40;t = (0:N-1)'/Fs;X = sin(2* *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);

编写一个创建并调用System对象™的函数。函数不需要知道向量的大小。对象保存第一次调用时输入信号的大小。

函数[yOut,validOut] = HDLFFT128V16(yIn,validIn)% HDLFFT128V16处理16个样本向量的FFT数据yIn是一个定点列向量。% validIn是一个逻辑标量值。您可以从这个函数生成HDL代码。持续的fft128v16;如果Isempty (fft128v16) fft128v16 = dsphdl。FFT (“FFTLength”, 128);结束[yOut,validOut] = fft128v16(yIn,validIn);结束

通过向对象传递16个元素向量来计算FFT。使用getLatency函数来查找第一个输出数据样例何时准备好。然后,添加帧长以确定调用对象的次数。因为对象变量在函数内部,所以使用第二个对象来调用getLatency.使用循环计数器翻转validInN输入样本。

tempfft = dsphdl.FFT;loopCount = getLatency(tempfft,N,V)+N/V;Yf = 0 (V,loopCount);validOut = false(V,loopCount);loop = 1:1:loopCount如果(mod(循环,N/V) == 0) i = N/V;其他的i = mod(循环,N/V);结束[Yf:循环),validOut(循环)]= HDLFFT128V16(复杂(y_vect(:,我)),(循环< = N / V));结束

丢弃无效的输出样本。

C = Yf(:,validOut==1);Yf_flat = C(:);

绘制FFT的频率通道数据。FFT输出是位反转的顺序。在绘图前重新排序。

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

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

创建一个新的dsphdl。FFT对象并请求延迟。

HDLFFT = dsphdl。FFT (“FFTLength”, 512);L512 = getLatency(hdlfft)
L512 = 599

请求具有不同FFT长度的相似对象的假设延迟信息。原始对象的属性不会改变。

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

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

L256v8 = getLatency(hdlfft,256,8)
L256v8 = 93

在FFT的每个阶段启用伸缩。延迟没有改变。

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

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

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

算法

全部展开

扩展功能

版本历史

在R2014b中引入

全部展开

R2022a的行为发生了变化

R2022a的行为发生了变化