我有一个10 the的音频信号样本,我需要找到我的信号的傅里叶系数。我在mathwork的网站上看到了一个例子,他们使用下面的代码对信号y进行fft分解:
NFFT = 2^nextpow2(L);
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);如果L是信号的长度,我真的不明白为什么它定义变量NFFT的方式如上面的代码所示?难道我就不能为NFFT选择任何价值吗?另外,我们为什么要在上面代码的第三行中使用Fs/2呢?
发布于 2015-04-03 21:42:09
NFFT可以是任何正值,但是当样本数被分解为小素数时,FFT计算通常要高效得多。引用Matlab文档
fft的执行时间取决于变换的长度。对两个人的力量来说是最快的。对于只有很小的素因子的长度,它的速度几乎一样快。对于素数或大素数因子的长度,它通常要慢几倍。
因此,对于大于或等于信号y的样本数的2的幂,计算快速傅立叶变换是常见的。这就是NFFT = 2^nextpow2(L)所做的事情(在Matlab文档中的示例 y中,构造它的长度为L)。当NFFT > L时,信号为零填充到NFFT长度。
就fs/2而言,这仅仅是因为实值信号的频谱具有Hermitian对称性(这意味着fs/2之上的值谱可以从fs/2以下的值的复共轭中得到),因此完全是从第一个NFFT/2+1值(索引NFFT/2+1对应于fs/2)中指定的。因此,与其显示fs/2上的冗余信息,示例选择只说明到fs/2的频谱。
发布于 2015-04-06 21:46:54
对于实值输入,FFT的输出是复杂的。这意味着,对于在Fs Hz采样的信号,该信号的傅里叶变换将包含从-Fs/2到Fs/2的频率分量,并且在零Hz时是对称的。(Nyquist准则指出,如果在f Hz处有最大频率分量的信号,则需要用至少2fHz采样。
你可能会想知道负频率在这里意味着什么。如果你是数学家,你可能关心负频率,但如果你是工程师,你可以选择忽略负频率的概念,只关注从0到Fs/2的频率。(f赫兹采样信号的最大freq分量为Fs/2)
使用FFT来了解更多关于信号中的频率成分的信息是很麻烦的。您可以使用MATLAB中的函数填充函数来了解信号中的更多频率以及这些信号的功率。MATLAB将自动计算NFFT所需的频率,并返回信号中的频率以及每个频率下的功率。使用以下语法:
p,f= pwelch(x,[],[],f)
有关更多信息,请参阅pwelch的文档。
https://stackoverflow.com/questions/29439888
复制相似问题