MATLAB-FFT和IFFT的Matlab实现(幅频响应和相拼响应)

MATLAB-FFT和IFFT的Matlab实现(幅频响应和相拼响应),第1张

一、Matlab的FFT函数

(1)函数的用法

Y = fft(x)

Y = fft(X,n)

Y = fft(X,n,dim)

(2)函数的定义

Y = fft(x) 和 y = ifft(X)分别用于实现正变换和逆变换,公式描述如下:

(3)函数描述

Y = fft(X)

用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。

·如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。

·如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。

·如果 X 是一个多维数组,则 fft(X) 将尺寸大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。

注意这里第一个尺寸不为1是指一个矩阵的第一个尺寸不为1的维。

比如一个矩阵是2 1,那么第一个尺寸不为1的维就是行(尺寸为2)。

X是 1 2 3表示第一个尺寸不为1的维就是列(尺寸为2)。

X为维数5 6*2的话,第一个尺寸不为1的维就是行(尺寸为5)。

Y = fft(X, n)

返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。

·如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。

·如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。

·如果 X 是矩阵,则每列的处理与在向量情况下相同。

·如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。

Y = fft(X, n, dim)

返回沿维度 dim 的傅里叶变换。例如,如果 X 是矩阵,则 fft(X,n,2) 返回每行的 n 点傅里叶变换。

如题:

.h 文件

.cpp 实现

'''c++

DFT_1D_TASK::DFT_1D_TASK()

{

    Nfft  = 0

    _fftIn  = nullptr

    _fftOut = nullptr

}

DFT_1D_TASK::DFT_1D_TASK(size_t N)

{

    Nfft = N

    _fftIn =  fftw_alloc_complex(Nfft)

    _fftOut = fftw_alloc_complex(Nfft)

    _fftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_FORWARD, FFTW_ESTIMATE)

    _ifftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_BACKWARD, FFTW_ESTIMATE)

}

void DFT_1D_TASK::ResetNfft(size_t N)

{

    ClearBuffer()

    Nfft = N

    _fftIn =  fftw_alloc_complex(Nfft)

    _fftOut = fftw_alloc_complex(Nfft)

    _fftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_FORWARD, FFTW_ESTIMATE)

    _ifftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_BACKWARD, FFTW_ESTIMATE)

}

DFT_1D_TASK::~DFT_1D_TASK()

{

    ClearBuffer()

}

bool DFT_1D_TASK::DFT_R2C(const vector &input, vector>&output){

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i]

        _fftIn[i][1] = 0

    }

    fftw_execute(_fftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0])

        output[i].imag( _fftOut[i][1])

    }

    return true

}

bool DFT_1D_TASK::IDFT_C2R(const vector>&input, vector &output)

{

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_ifftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i] = _fftOut[i][0]/Nfft

    }

    return true

}

bool DFT_1D_TASK::DFT_C2C (const vector>&input, vector>&output)

{

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_fftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0])

        output[i].imag( _fftOut[i][1])

    }

    return true

}

bool DFT_1D_TASK::IDFT_C2C(const vector>&input, vector>&output){

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_ifftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0]/Nfft)

        output[i].imag( _fftOut[i][1]/Nfft)

    }

    return true

}

void DFT_1D_TASK::ClearBuffer()

{

    if(_fftIn != nullptr)

        fftw_free(_fftIn)

    if(_fftOut != nullptr)

        fftw_free(_fftOut)

    fftw_destroy_plan(_fftPlan)

    fftw_destroy_plan(_ifftPlan)

}

'''

DFT,即可测试性设计(Design for Testability, DFT)是一种集成电路设计技术,它将一些特殊结构在设计阶段植入电路,以便设计完成后进行测试。电路测试有时并不容易,这是因为电路的许多内部节点信号在外部难以控制和观测。通过添加可测试性设计结构,例如扫描链等,内部信号可以暴露给电路外部。总之,在设计阶段添加这些结构虽然增加了电路的复杂程度,看似增加了成本,但是往往能够在测试阶段节约更多的时间和金钱。

IDFT就是Inverse Discrete Fourier Transform 离散傅里叶逆变换。FFT就是Fast Fourier Transform 快速傅里叶变换。

两者的应用都是将时域中难以处理的信号转换成易于处理的频域信号,分析完成后进行傅里叶反变换即得到原始的时域信号。

两者的异同是:我们知道在数学上用级数来无限逼进某个函数,以便简化计算过程而又不致使误差过大,这样工程上才能应用,否则一些数学模型是无法实现快速求解的。

IDFT:对于有限长的序列我们可以使用离散傅立叶变换,IDFT是对序列傅立叶变换的等距采样。

FFT:并不是与IDFT不相同的另一种变换(即原理是一样的),而是为了减少IDFT运算次数的一种快速算法。它是对IDFT变换式进行一次次的分解,使其成为若干小点数IDFT的组合,从而减小运算量。常用的FFT是以2为基数,它的运算效率高,程序比较简单,使用也十分地方便。

IFFT——Inverse Fast Fourier Transform 快速傅里叶逆变换。

快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8073407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存