假设信号对应于一年(365天)中的日值。它由所有零组成,除了几个稀疏值,这些稀疏值对应于所有以相同间隔(30天)分开的孤立峰。我使用快速傅立叶变换功能获得频谱。
编辑:这与信号的非零均值性质有关。有关更多详细信息,请参见this post。
下面是我的代码。它已在Octave中进行了测试,但也应在Matlab中工作
close all
clear all
T = 1/365; % period
samp_freq = 1/T; % sample frequency
t=0:T:2; % overall time span is two years
% build signal
x= zeros(length(t),1);
for i=1:length(t)
if mod(i,30) == 0
x(i) = 100;
else
x(i) = 0;
end
end
figure(1)
plot(t,x)
grid
xlabel("Time [years]")
ylabel("Signal amplitude")
y=fft(x);
N = length(x);
for i=1:N
f(i) = (i-1)*samp_freq/N;
end
figure(2)
plot(f,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")
figure(3)
plot(f(1:80),abs(y(1:80)))
xlabel("Frequency")
ylabel("Signal amplitude")
最佳答案
0 Hz处的峰值代表信号的“DC分量”,与算术平均值相同。您可以从数据集中减去平均值以消除此误差,或忽略它。
其他以12 Hz为倍数的峰值称为"harmonics"-之所以存在是因为您的周期信号不是正弦波(实际上是脉冲序列)。第一个峰值为12 Hz,称为"fundamental"。您可以对信号进行预滤波以消除谐波,也可以忽略上面的所有内容(例如20 Hz)。
您可能还需要考虑将window function应用于数据,以减少spectral leakage,从而使峰更尖锐,更准确。
关于matlab - 仅正稀疏信号的FFT的意外峰值[OCTAVE或MATLAB],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42620759/