基于Matlab的FFT信号频谱计算与绘制

基于Matlab的FFT信号频谱计算与绘制,matlab,signal-processing,fft,spectrum,continuous-fourier,Matlab,Signal Processing,Fft,Spectrum,Continuous Fourier,在Matlab上使用FFT计算信号频谱时,我遗漏了一些东西。 我的代码: 你能告诉我我在哪里搞砸了吗 我尝试使用相同信号的两次采样(相同的采样频率;在两个不同的时间范围0-10和0-100)检查算法是否有效: 我想这两种光谱应该是互补的,但它们不。。。如图所示: 谢谢好消息是,你对光谱本身的计算没有问题 问题是,通过查看不同长度的样本,实际上您看到的是两个不同的样本。 在时域中,它们可以看作是无限长正弦曲线与不同长度矩形窗口相乘的结果 在频域中,无限长连续时间正弦信号的频谱与矩形窗的频谱进行卷

在Matlab上使用FFT计算信号频谱时,我遗漏了一些东西。 我的代码:

你能告诉我我在哪里搞砸了吗

我尝试使用相同信号的两次采样(相同的采样频率;在两个不同的时间范围0-10和0-100)检查算法是否有效:

我想这两种光谱应该是互补的,但它们不。。。如图所示:


谢谢

好消息是,你对光谱本身的计算没有问题

问题是,通过查看不同长度的样本,实际上您看到的是两个不同的样本。 在时域中,它们可以看作是无限长正弦曲线与不同长度矩形窗口相乘的结果


在频域中,无限长连续时间正弦信号的频谱与矩形窗的频谱进行卷积。对于不同的窗口长度,这些窗口的相应光谱具有不同的宽度(对于较长的矩形窗口,光谱较窄)。因此,无限长正弦信号频谱中的尖峰会分布在不同的带宽上。这正是你所看到的。

好消息是,你对光谱本身的计算没有任何错误

问题是,通过查看不同长度的样本,实际上您看到的是两个不同的样本。 在时域中,它们可以看作是无限长正弦曲线与不同长度矩形窗口相乘的结果


在频域中,无限长连续时间正弦信号的频谱与矩形窗的频谱进行卷积。对于不同的窗口长度,这些窗口的相应光谱具有不同的宽度(对于较长的矩形窗口,光谱较窄)。因此,无限长正弦信号频谱中的尖峰会分布在不同的带宽上。这正是您所看到的。

对于第一个示例,您可以解释为什么您认为这不起作用(显示日志错误或照片)。对于第二个例子,你可以上传一张照片,显示两个光谱都不支持。对于第二个例子,两个光谱都不能支持,因为你所使用的矩形窗口在两个
数据中都不相同。这段代码与MathWorks提供的代码大致相同。我看不出你在哪里“搞砸了”。你能解释一下为什么你认为这是不正确的吗?只有一个例子。代码的第一部分是实际的算法,代码的第二段就是我用来探测(第一)代码的信号。基本上,这两个信号实际上是使用采样频率fs计算的相同函数,但在不同的时间范围内(10和100)。因此,我应该找到两个信号的相同频谱。这不是这里看到的情况:(.图);(.png)感谢您的帮助对于第一个示例,您可以解释为什么您认为这不起作用(显示日志错误或照片)。对于第二个例子,你可以上传一张照片,显示两个光谱都不支持。对于第二个例子,两个光谱都不能支持,因为你所使用的矩形窗口在两个
数据中都不相同。这段代码与MathWorks提供的代码大致相同。我看不出你在哪里“搞砸了”。你能解释一下为什么你认为这是不正确的吗?只有一个例子。代码的第一部分是实际的算法,代码的第二段就是我用来探测(第一)代码的信号。基本上,这两个信号实际上是使用采样频率fs计算的相同函数,但在不同的时间范围内(10和100)。因此,我应该找到两个信号的相同频谱。这不是这里看到的情况:(.图);(.png)谢谢你的帮助
%% compute the spectrum of the data (data(t))
L = length(time); % length of the sample
NFFT = 2^(nextpow2(L)-1); % Next power of 2 from length of y
Y = fft(data,NFFT);%/NFFT;%L;
Fs = 1/(mean(time(2:end)-time(1:end-1)));  % compute the sampling frequency
f = Fs/2*linspace(0,1,NFFT/2+1);
loglog(f,2*abs(Y(1:NFFT/2+1)))
title('Single-Sided Amplitude Spectrum of My Data')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
fs=1000;
time10 = [0:1/fs:10];
time100 = [0:1/fs:100];
data10 = sin(2*pi*0.23 .*time10)+cos(2*pi*12 .*time10);
data100 = sin(2*pi*0.23 .*time100)+cos(2*pi*12 .*time100);