带FFT的加速度计 - 奇怪的输出

时间:2014-12-01 21:56:26

标签: matlab signal-processing fft accelerometer

在阅读了大量研究并就主题进行研究之后,我仍然遇到将FFT应用于加速度计数据的问题。我的大多数代码都来自官方MATLAB示例:FFT for one dimension。经过更多阅读后,我发现了这个问题:FFT and accelerometer data: why am I getting this output?其中有建议使用窗口。所以经过一些阅读之后,我在我的代码中添加了汉明窗口。

我的数据在情节上看起来像这样: enter image description here

这是我用于FFT的代码:

fs = 1/0.02; %0.02 comes from picking sample each 20ms
m = size(data,1);
w = hanning(m);
yw = w.*data;
n = pow2(nextpow2(yw));
y = fft(yw,size(n,1));
f = (0:size(n,1)-1)*(fs/size(n,1));
power = y.*conj(y)/size(n,1);
figure
plot(f,power)

问题是我的代码中的情节看起来像这样: enter image description here

有人可以告诉我我的代码有什么问题吗?说实话,我会说它看起来会更好(类似这样:http://imgur.com/wGs43)所以这就是我问这个问题的原因。

修改 我的数据可以在这里找到:https://dl.dropboxusercontent.com/u/58774274/exp.txt

3 个答案:

答案 0 :(得分:2)

您的Fs50,因此数据中的最高频率可为Fs/2 = 25Hz

查看此代码是否有帮助。

fid = fopen('1.txt','r');
C = textscan(fid, '%f');
fclose(fid);
data = C{1};
fs = 50;
m = length(data);
nfft = 2^nextpow2(m);
y = fft(data,nfft)/m;
f = fs/2 * linspace(0,1,nfft/2+1);
power = abs(y);
subplot(211)
plot(f,power(1:nfft/2+1)) 
t = (0 : m-1)/fs;
s0 = .8*fs : 3.2*fs;  % .8 sec to 3.2 sec
p(s0) = .5*cos(2*pi*3.3*t(s0)+.25*pi); 
p = p + mean(data); 
subplot(212)
plot(t,data);hold on
plot(t,p,'r')

enter image description here

这是您在频域中的数据。

3.3 Hz处有一个高峰。

作为证明,我绘制了频率为3.3 Hz的正弦曲线和数据,

如您所见,它完全符合您的数据。

答案 1 :(得分:2)

如果您首先移除DC偏移(在计算FFT之前减去每个点的所有样本的平均值),您的图表看起来会更好,然后仅绘制一半FFT结果数据点(N / 2)或更少(因为FFT结果的上半部分只是实数据输入的前半部分的共轭镜像。

答案 2 :(得分:1)

您的参考图表显示的是对数刻度上的幅度(以dB为单位)。此外,似乎DC偏移被删除。因此,如果您在代码中对其进行调整,最终会得到类似的结果。

data = data-mean(data); % DC removal
fs = 50;
m = length(data);
nfft = 2^nextpow2(m);
y = fft(data,nfft)/m;
f = fs/2 * linspace(0,1,nfft/2+1);
power = abs(y);
plot(f,10*log10(power(1:nfft/2+1))); % plot log magnitude
ylim([-30 0]) %limit axis

至少与我相似。

enter image description here

如果您另外采用绝对平方,则基本上估计信号的功率谱密度。这意味着您必须将power = abs(y);更改为power = abs(y.^2);,然后显然必须将ylim([-30 0])调整为低于-50的值。