Matlab 为什么它显示多个或变化的频率?

Matlab 为什么它显示多个或变化的频率?,matlab,fft,Matlab,Fft,我预计频率分量为1700,即1700时出现峰值,但输出显示多个频率: fs = 44100; t = 0:1/fs:0.001; s = sin(2 * pi * 1700 * t); subplot(211), stem(abs(fft(s))), title('abs(fft(s))') subplot(212), stem(s), title('s') 同样,当我尝试下面的代码时,我没有得到我所期望的: Fs = 8000; dt = 1/Fs; StopTime

我预计频率分量为1700,即1700时出现峰值,但输出显示多个频率:

fs = 44100;
t = 0:1/fs:0.001;
s = sin(2 * pi * 1700 * t);
subplot(211), stem(abs(fft(s))), title('abs(fft(s))')
subplot(212), stem(s), title('s')

同样,当我尝试下面的代码时,我没有得到我所期望的:

Fs = 8000;
dt = 1/Fs;           
StopTime = 0.25;        
t = (0:dt:StopTime-dt)'; 
Fc = 60;                    
x = cos(2*pi*Fc*t);
subplot(211), stem(abs(fft(x))), title('abs(fft(x))')
subplot(212), stem(x), title('x')
为什么我的频率分量显示为倍数值,因为在一个稳定的正弦波/余弦波中,信号中应该只有一个频率


由于您的信号不是整数个周期,因此存在不连续性(请记住,傅里叶变换假定为周期性),从而导致频谱的“模糊”。为了避免这种情况,我们通常在FFT之前应用一个合适的(例如),将其视为平滑不连续性。这减少了涂抹,使峰值更加清晰


正如在另一个答案中提到的,你也会看到第二个峰值,因为你正在绘制整个频谱,时域中的每个分量在频域中都有一个正的和一个负的频率分量。对于实值信号,FFT在频域是复共轭对称的,因此频谱的一半是冗余的。通常只绘制N/2个值。

由于信号不是整数个周期,因此存在不连续性(请记住,傅里叶变换假定周期性),这导致频谱的“模糊”。为了避免这种情况,我们通常在FFT之前应用一个合适的(例如),将其视为平滑不连续性。这减少了涂抹,使峰值更加清晰


正如在另一个答案中提到的,你也会看到第二个峰值,因为你正在绘制整个频谱,时域中的每个分量在频域中都有一个正的和一个负的频率分量。对于实值信号,FFT在频域是复共轭对称的,因此频谱的一半是冗余的。通常只绘制N/2个值。

这是一个单一频率,但它出现两次:正频率和负频率。您将在中更好地看到这一点,它安排了频率采样,以便它们从-fs/2运行到fs/2:

例如,在第一个示例中,这将生成下图

注意+1700和-1700 Hz左右的两个峰值。其位置不准确,原因有二:

  • 您的时间信号具有有限的持续时间,这会在频域中产生与sinc的卷积。也就是说,频率尖峰变得更宽
  • FFT给出频率样本,这些样本中没有一个精确地落在+/-1700 Hz处

在第二个示例中,时间信号更长(它包含更多的周期),这减少了频率峰值的宽度。这可以在您的第二幅图中看到(同样需要进行
fftshift
校正,以使两个尖峰出现在对称频率位置)。

这是一个单一频率,但它出现两次:正频率和负频率。您将在中更好地看到这一点,它安排了频率采样,以便它们从-fs/2运行到fs/2:

例如,在第一个示例中,这将生成下图

注意+1700和-1700 Hz左右的两个峰值。其位置不准确,原因有二:

  • 您的时间信号具有有限的持续时间,这会在频域中产生与sinc的卷积。也就是说,频率尖峰变得更宽
  • FFT给出频率样本,这些样本中没有一个精确地落在+/-1700 Hz处

在第二个示例中,时间信号更长(它包含更多的周期),这减少了频率峰值的宽度。在您的第二幅图中可以看出这一点(同样需要进行
fftshift
校正,以使两个尖峰出现在对称频率位置)。

我认为泄漏(涂抹)是由有限持续时间(时间窗口)的信号引起的,而不是由discontinuity@LuisMendo:需要注意的是,如果信号是一个精确的周期数,则不会出现泄漏,因为这会使不连续性消失。当然,看待这些事情的方式往往不止一种,你是对的。我的样品太多了。对于整数个周期,真实频谱(傅里叶变换)中存在的涂抹被DTF/FFT固有的频率采样所隐藏(所有频率采样都落在sinc的零点)。谢谢这让我松了一口气——我以为我们在时空连续体中遇到了裂痕!;-)哈哈哈,我不会说连续体。在连续频谱(无频率采样)中,我或多或少是对的;-)我认为泄漏(涂抹)是由有限持续时间(时间窗口)的信号引起的,而不是由discontinuity@LuisMendo:需要注意的是,如果信号是一个精确的周期数,则不会出现泄漏,因为这会使不连续性消失。当然,看待这些事情的方式往往不止一种,你是对的。我的样品太多了。对于整数个周期,真实频谱(傅里叶变换)中存在的涂抹被DTF/FFT固有的频率采样所隐藏(所有频率采样都落在sinc的零点)。谢谢这让我松了一口气——我以为我们在时空连续体中遇到了裂痕!;-)哈哈哈,我不会说连续体。在连续频谱(无频率采样)中,我或多或少是对的;-)你完全正确。只需添加-您的频率轴基本上是
(0:1/T:(N-1)/T)
(当不使用
fftshift
)时,
N
是采样数,
T
是时间长度。这很容易理解,如果
T
增加,频率分辨率(在感兴趣的频率附近)就会增加,正如您已经指出的那样。此外,只有出现在该轴上的频率才会显示为无泄漏。你完全正确。只是
subplot(211)
freq_axis = -fs/2+fs/numel(t):fs/numel(t):fs/2;
stem(freq_axis, abs(fftshift(fft(s))))
title('abs(fft(s))')