分析第四天中用到的傅里叶变换, 发现我们的采样点间隔总是0.2
秒. 作为实验, 我将演示这个间隔是影响数据的谱的.
均匀傅里叶变换
一个典型的实验是看函数,
的谱. mma代码如下:
n = 400;
pos=Sort[Table[i/n, {i, n}]] // DeleteDuplicates;
testData = Table[N@Sin[100 2Pi x], {x, 0, 1, 1/n}];
ListLinePlot[testData]
ListLinePlot[Abs[Fourier[testData]], PlotRange -> All]
即我们取离散的点列pos
, 它是等间距分布在区间上的. 间隔为
. 其函数图象如下(用直线连接了离散的点):
fourier-uniform-data
而得到的谱为: 频率
fourier-uniform-spectrum
我想这些规律都可以从均匀傅里叶变换的公式推导得出:
其中
容易验证如下规律:
- 如果函数
, 则
; 从而其最大值也放大
倍;
fun[data_] := Module[
{fd, mx, pos},
fd = N[Abs[Fourier[data]]];
ListLinePlot[fd, PlotRange -> All]
mx = Max[fd];
pos = Position[fd, mx][[1, 1]];
Return[{mx, pos}]
]
data1 = Table[Table[i Sin[ 30 2 Pi n/200], {n, 200}], {i, 10}];
Table[fun[data1[[i]]], {i, Length[data1]}] // MatrixForm
- 如果函数
, 即做平移, 则
的峰值不会改变;
data2 = Table[Table[Sin[ 30 2 Pi n/200 - i], {n, 200}], {i, 10}];
Table[fun[data2[[i]]], {i, Length[data2]}] // MatrixForm
data3 = Table[Table[Sin[ 30 2 Pi n/200] - i, {n, 200}], {i, 10}];
Table[fun[data2[[i]]], {i, Length[data3]}] // MatrixForm
-
的定义域的范围会影响傅里叶变换的峰值位置和大小; 范围扩大
倍, 则
取得最大值的位置也扩大
倍, 大小扩大
;
data4 = Table[Table[N[ Sin[30 2 Pi n/200]], {n, i 200}], {i, 10}];
Table[fun[data4[[i]]], {i, Length[data4]}];
fr = %[[1 ;;, 1]];
%% // MatrixForm
gh = ListPlot[fr];
fit = NonlinearModelFit[fr, a s^k, {a, k}, {s}];
% // Normal
fitgh = Plot[fit[x], {x, 1, Length[fr]}, Frame -> True];
Show[{gh, fitgh}]
非均匀傅里叶变换
我们将看到, 对非均匀傅里叶变换, 不能套用均匀傅里叶变换的公式:
n = Floor[4 500./2/Pi];
dpos = Sort[Table[Random[], {i, n}]] // DeleteDuplicates;
(*compare to dpos=Sort[Table[i/n,{i,n}]]//DeleteDuplicates;*)
testDatar = N@Sin[500 dpos ];
ListLinePlot[Abs[Fourier[testDatar]], PlotRange -> All]
non-uniform-fourier-spec
这可以由如下公式修正:
spec[w_?NumericQ] :=
1/Sqrt[Length[dpos]] Exp[2 Pi I (w - 1) (dpos - 1)].testDatar
Plot[Abs[spec[w]], {w, -300, 300}, PlotRange -> All]
non-uniform-fourier-spec-modify
即我们手动定义了傅里叶变换的公式, 加入了时间变量:
其中
重新抓取数据
前面提到数据抓取的间隔太大, 这可以由
mSensorManager.registerListener(this, mAccelerometer, 10);
手动指定抓取时间间隔为.
希望对新数据可以得到步态的周期.