Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab,FFT频率范围差异还是相同?_Matlab_Fft_Dft - Fatal编程技术网

Matlab,FFT频率范围差异还是相同?

Matlab,FFT频率范围差异还是相同?,matlab,fft,dft,Matlab,Fft,Dft,我试图理解matlab中的FFT是如何工作的,特别是如何定义绘制它的频率范围。碰巧我从matlab帮助链接和其他讨论中读到了,我想(猜测)我对此感到困惑。 在matlab链接中: 它们将频率范围定义为: f = (0:n-1)*(fs/n) 使用n和fs作为: n = 2^nextpow2(L); % Next power of 2 from length of signal x fs = N/T; % N number of samples in x and T the total time

我试图理解matlab中的FFT是如何工作的,特别是如何定义绘制它的频率范围。碰巧我从matlab帮助链接和其他讨论中读到了,我想(猜测)我对此感到困惑。 在matlab链接中: 它们将频率范围定义为:

f = (0:n-1)*(fs/n)
使用
n
fs
作为:

n = 2^nextpow2(L); % Next power of 2 from length of signal x
fs = N/T; % N number of samples in x and T the total time of the recorded signal
但另一方面,在上一篇文章中 (基于先前版本的matlab),产生的频率范围定义为:

f = fs/2*linspace(0,1,NFFT/2+1);
与前面提到的
n
一样使用
NFFT
(信号长度的下一次幂为2
x
)。 那么,基于此,这些不同的向量(方程1和最终方程)怎么可能是相同的呢?
如果您可以看到,向量是不同的,因为前者有
n
点,而后者有
NFFT/2
点!事实上,系数
(fs/n)
不同于
fs/2

混淆可能是因为您所引用的两个示例以不同方式绘制fft结果。有关本说明中的参考信息,请参考以下代码

在第一个示例中,该图是频率范围内的功率谱(周期图)。请注意,在第一个图中,周期图并非以0为中心,这意味着频率范围似乎是奈奎斯特采样频率的两倍。如mathworks链接中所述,通常的做法是将周期图居中于0以避免这种混淆(图2)

对于第二个示例,采用相同的参数,原始图显示了傅里叶光谱的振幅,其归一化程度与第一个示例不同(图3)。使用Matlab的全频率排序语法(如代码中所述),将这个看似不同的fft结果转换为示例1的结果是很简单的;图4中复制了以0为中心的周期图的相同结果

因此,为了具体回答您的问题,两种情况下的频率范围相同,最大频率等于奈奎斯特采样频率,如中所示:

f = fs/2*linspace(0,1,NFFT/2+1);
理解dfft如何工作(同样在Matlab中)的关键是理解您只是在将离散数据集投影到傅里叶空间,其中Matlab中的fft()函数返回的是每个频率分量的展开系数,并且给出了系数的顺序(在Matlab中如示例2所示)通过:

有关更多详细信息,请参见DFT上的Wikipedia页面:

将忽略长度的fft作为2的幂参数,也可能对您有所帮助

y = fft(x).
在这种情况下,在y中只会看到一些与输入信号的精确系数相对应的非零分量。mathworks页面声称以下是使用或不使用此长度的动机:

“使用2的幂作为变换长度可以优化FFT算法,尽管在实践中,与使用n=m相比,执行时间通常相差不大。”

那么,基于此,这些不同的向量(方程1和最终方程)怎么可能是相同的呢

绘制FFT的整个
n
点输出。这包括从0到接近
fs
(精确地
(n-1)/n*fs
)的频率。然后,他们进行以下观察(对FFT的实际输入有效):

频率范围的前半部分(从0到奈奎斯特频率
fs/2
)足以识别数据中的分量频率,因为后半部分只是前半部分的反射

只选择不显示冗余的第二部分,然后使用一半的点数,这也覆盖了一半的频率范围

事实上,因子(fs/n)不同于fs/2

也许理解它的最简单方法是比较两个表达式的输出以获得
n
的某个小值,即
n=8
和设置
fs=1
(因为
fs
将两个表达式相乘)。一方面,第一个表达式的输出
[0:n-1]*(fs/n)
将是:

0.000  0.125  0.250  0.500  0.625  0.750  0.875
0.000  0.125  0.250  0.500
fs/2*linspace(0,1,n/2+1)
的输出为:

0.000  0.125  0.250  0.500  0.625  0.750  0.875
0.000  0.125  0.250  0.500

正如你所看到的,频率集在奈奎斯特频率
fs/2

平面上完全相同,而且非常简单。感谢你的解释,亲爱的侦探,谢谢。事实上,这是一个完整的答案,也是一个非常有用的代码,可以理解你的解释以及matlab的DFT和fft的一般内容。亲爱的Gohann,这是我的荣幸。我很高兴这对你有帮助。