matlab中值得注意的FFT知识点

整理一下需要注意的FFT知识点,主要来源:https://blog.csdn.net/czyt1988/article/details/84995295

FFT公式

Y = fft(signal,N)

其中signal为时域信号,N为FFT长度。当N大于signal长度,则要补零到N个点,当N小于signal长度,就截取前N个点。注意,N一般设置为2的幂次方,以便改善FFT性能。可采用nextpow2函数求N的值

N = 2^nextpow2(length(signal));

FFT的结果Y是一个N个值的复数,满足以下规律:

  • 第0和N/2的两个值虚数部分为0,是对称的直流分量。
  • 下标为i和N-i的两个复数是共轭的,所以有用的信息储存在0到N/2+1个值中。

频谱分辨率

\Delta f=\frac{fs}{N}

其中fs是采样率,N是FFT点数。N个点中每个点的分辨率均为\Delta f。则N个点对应的频段向量fre=(1:N)*\Delta f

直流分量

直流信号代表与基准0的偏移量。

FFT后的复数模-幅度

  • 第一个点(i=0)和最后一个点的模(i=N/2)除以N
  • 其余点的模除以N/2

原因

这是因为傅里叶级数对应时域幅值,其中已经包含了1/N项,而fourier变换中没有该系数, 所以,进行完FFT变换后需除以N/2才能与时域对应上。(这里还不是很清楚)

F(n)= \sum_{i=0}^{N-1}{x_ie^{ \frac{-2\pi j}{N}ni}}

全世界绝大部分的FFT算法计算出来后都需要进行幅度的转换的,为何要这样设计,因为傅里叶变换在很多场合是不需要求幅度的,而只需要分贝就可以,因此,如果傅里叶变换做了乘以2除以n的处理反而在许多场合是多余的,就像求距离,好多情况只需要x^2 + y ^2就可以了,并不需要\sqrt{ {x^2} + {y^2}}
幅值根据需求有不同需求,具体见下节

幅度谱,幅值谱?Magnitude,Amplitude?

  • 幅值 Amplitude
    幅值就是对于波形的幅值来说的,上面一节说的转换就是把fft计算的结果转化为幅值,英文叫Amplitude
    在工程中还经常看到分贝纵坐标的频谱,带分贝的频谱,使用分贝数的好处是,用较小的坐标可以描述很宽的范围。工程上会取20log(Amplitude)转变为分贝。
    幅值第n(其中n!=1)点处的fft计算的结果是复数a+bi,模值A=sqrt(a2+b2),那么实际信号的幅值是2*A/N;
    当n=0时(0Hz),也就是第一个点就是直流分量,它的模值就是直流分量的N倍,实际信号的幅值是A/N,注意N是采样点而不是进行FFT的点数

  • 幅度 Magnitude
    若对fft的结果不做任何处理,直接取模,那么这个值叫幅度,英文上叫Magnitude,

于是对fft计算的复数结果,其实数和虚数对应如下:

名称计算公式
幅度(Magnitude)\sqrt{Re^2+Im^2}
幅值(Amplitude)i=(0,\frac{n}{2}) ,A=\frac{\sqrt{Re^2+Im^2}}{n};otherwise, A=\frac{2\sqrt{Re^2+Im^2}}{n}
dB20log(Amplitude)

根据这个表,就可以很明白FFT之后需要进行什么样的处理了。

其实还有:

  • 截断加窗问题

  • 加窗频谱幅值修正问题

 

 

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写自己的fft2函数主要包括以下几个步骤: 1. 输入参数检查:检查输入矩阵是否为二维矩阵,如果不是则报错。 2. 零填充:根据输入矩阵的大小,选择一个扩展后大小为2的幂次方的矩阵进行零填充操作。 3. 列向量fft:对于矩阵的每一列进行一维FFT,得到每列的频域表示。 4. 行向量fft:对于矩阵的每一行进行一维FFT,得到每行的频域表示。 5. 变换结果转置:对于得到的频域表示,进行转置操作,得到与输入矩阵大小一致的矩阵。 6. 输出结果返回:输出转置后的频域矩阵。 下面是一个简化版的自定义fft2函数示例: ```matlab function result = myfft2(matrix) % 输入参数检查 [m, n] = size(matrix); if ndims(matrix) ~= 2 error('输入矩阵必须是二维的!'); end % 零填充 p = 2^(nextpow2(m) - 1); q = 2^(nextpow2(n) - 1); padded_matrix = zeros(p, q); padded_matrix(1:m, 1:n) = matrix; % 列向量fft fft_col = zeros(size(padded_matrix)); for i = 1:size(padded_matrix, 2) fft_col(:, i) = fft(padded_matrix(:, i)); end % 行向量fft fft_result = zeros(size(fft_col)); for i = 1:size(fft_col, 1) fft_result(i, :) = fft(fft_col(i, :)); end % 转置结果 result = fft_result'; end ``` 使用该自定义fft2函数,可以将一个二维矩阵转换到频域表示,并返回一个与输入矩阵大小相同的矩阵。注意,这只是一个简化版本的示例,实际的fft2函数还需考虑一些优化策略,例如使用快速傅里叶变换算法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值