第五天. 非均匀离散傅里叶变换

分析第四天中用到的傅里叶变换, 发现我们的采样点间隔总是0.2秒. 作为实验, 我将演示这个间隔是影响数据的谱的.

均匀傅里叶变换

一个典型的实验是看函数f(x)=\sin(100 \times (2\pi x)), x\in[0,1]的谱. 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, 它是等间距分布在[0,1]区间上的. 间隔为1/n. 其函数图象如下(用直线连接了离散的点):

fourier-uniform-data

而得到的谱为: 频率
100
.
fourier-uniform-spectrum

我想这些规律都可以从均匀傅里叶变换的公式推导得出:
v_s=\frac{1}{\sqrt N}\sum_{n=1}^N u_ne^{2\pi i(n-1)(s-1)/N}.

其中
u_n
就是数据在第
n
个点处的值, 而
v_s
\{u_n\}
的傅里叶变换在
s
位置的值.

容易验证如下规律:

  • 如果函数\tilde u_n=C u_n, 则\tilde v_s=C v_s; 从而其最大值也放大C倍;
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
  • 如果函数\tilde u_n=u_{n+x_0}+y_0, 即做平移, 则v_s的峰值不会改变;
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
  • u_s的定义域的范围会影响傅里叶变换的峰值位置和大小; 范围扩大C倍, 则v_s取得最大值的位置也扩大C倍, 大小扩大\sqrt{C};
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

即我们手动定义了傅里叶变换的公式, 加入了时间变量:
v_s=\frac{1}{\sqrt{N}}\sum_{n=1}^Nu_ne^{2\pi i (s-1)(p_n-1)},

其中
p_n
就是数据
u_n
对应的时刻.

重新抓取数据

前面提到数据抓取的间隔太大, 这可以由

mSensorManager.registerListener(this, mAccelerometer, 10);

手动指定抓取时间间隔为0.01s.

希望对新数据可以得到步态的周期.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚...
    constant007阅读 4,726评论 1 10
  • 网上关于从连续傅里叶变换推导出离散傅里叶变换公式的资料好像比较少,博主查阅了不少资料,总结出了一个推导的思路,现在...
    llooRice阅读 58,554评论 1 8
  • 作者:我爱小猪 公众号:情人节的一束玫瑰 诗经.蒹葭 蒹葭苍苍,白露为霜。所谓伊人,在水一方。 溯洄从之,道阻且...
    我爱小猪_b39b阅读 1,467评论 2 3
  • 深入理解傅里叶变换Mar 12, 2017 这原本是我在知乎上对傅立叶变换、拉普拉斯变换、Z变换的联系?为什么要进...
    价值趋势技术派阅读 5,986评论 2 2
  • 2017年的一天中午,我无意中学会录屏了。 其实,在今年年初我就想学习录屏,想他们怎么制作的视频。我也想把自己懂的...
    我心我愿秀阅读 365评论 1 4

友情链接更多精彩内容