从网上弄到了数据 今天用Excel做了算法仿真 感谢数据来源 是ghub上的glucose-PPG-data-set项目 据说来自某PPG开发板(不得不说 这个板子的原始数据也够漂亮 可能实际上没有那么好 或者已经滤波处理过)
先看看原始数据 大概采样率是每秒8个点 (我移动平均点数选太大了 不过不影响分析)
如果采用包含多个周期的 时间窗口较长的FFT 结果如下图
如果采用只有2个波形的 短时间窗口的FFT 结果如下
结果很明显也符合经验 长窗口带来好的分辨能力 但是非常大部分的频点都是不需要的 但又不能从蝶形分解运算量中忽略 该用的缓冲区内存也不能省(数量估计可以用结果频点数 乘窗口内需要容纳的最慢时候的心跳波包数得到 一般需要1000多个缓存点 还不包括蝶形分解再加一倍的缓存 才能满足包含几个波包的窗口)
而短窗口可以减少对不需要的频点的运算 但是结果的分辨率不高
而且 如果不是excel自带FFT分析 我不可能在上面用公式模拟 太烦了
但是正交鉴相就是用正交的两个波形去对采样值做简单的乘法和累加 可以容易的自写公式实现 开发起来也简单
下面是使用传统的正弦余弦波进行鉴相的结果 中间的曲面图揭示了心跳频点随着采样点增加 逐渐凸显的过程
计算简单 而且不需要对不在乎的频率进行计算 即使计算再长的时间窗口 也不需要多余的缓冲区内存 仅需要保留每个频点的积分值 32个采样点就有明显结果 256个采样点后 结果漂亮 分辨能力绝对够高
如果采用开关方波进行鉴相 更不用乘法 只是加或者减 结果如下
与精密的正弦余弦鉴相对比 有所区别但是区别不大 对于找到心跳频率这一种民用产品 不需要更多的处理 也足够用了
再继续精简和去除剩下的乘法 用IQ两值的绝对值的和 代替需要计算平方和的矢量长 结果如下
也是够用了 (对于每秒8个点而言 也许不必省下这不多的乘法 我可能会采用每秒20个点 应该也不用省下)
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |