我有一组 75 Hz 的样本,我想以 128 Hz 存储它们。如果是 64 Hz 和 128 Hz,那很简单,我只需将所有样本加倍即可。但是,如果采样率不是彼此的一小部分,那么正确的方法是什么?
当您想避免过滤时,您可以:
-
将信号处理为一组连接的插值三次曲线
但这一点与使用线性插值相同。如果不了解更多关于你的信号和目的的信息,你就无法构建valid
系数(不损害信号精度)例如如何构造这样的立方体请看这里:
- 我的插值三次方 https://stackoverflow.com/a/20517874/2521214
子弹中#3该链接内部是我使用的系数。我认为甚至足以满足您的目的,因此您可以尝试一下。如果你想进行自定义插值,请看这里:
- 如何构建自定义插值曲线 https://stackoverflow.com/a/23627081/2521214
-
创建可以在采样开始后给定时间内返回信号中的点的函数
所以做类似的事情
double signal(double time);
where time
是从采样开始算起的时间,以 [s] 为单位。在此函数内计算您需要访问哪 4 个样本。
ix = floor(time*75.0);
为您提供曲线起点样本索引。三次方需要 4 个点,一个在曲线之前,一个在曲线之后......所以对于插值三次点p0,p1,p2,p3
使用样品ix-1,ix,ix+1,ix+2
。计算三次系数a0,a1,a2,a3
并计算三次曲线参数t
(我使用范围<0,1>
) so
t=(time*75.0); t-=floor(t);
- 绿色 - 实际曲线段
- aqua - 实际曲线段控制点 = 75.0 Hz 样本
- 红色 - 曲线参数插值参数 t
- 灰色-实际时间
抱歉,我忘记绘制实际的输出信号点,它应该是绿色和灰色的交集
-
只需对采样数据进行 for 循环,时间步长为 1/128 s
像这样的东西:
double time,duration=samples*75.0,dt=1.0/128.0;
double signal128[???];
for (time=0.0,i=0;time<duration;i++,time+=dt)
signal128[i]=signal(time);
样本是按 75.0 Hz 采样的样本中的输入信号数组大小
[notes]
- for/duration 可以对整数进行...
- 将信号数据类型更改为您需要的
- inside
signal(time)
您需要处理边缘情况(信号的开始和结束)
- 因为在第一个样本之前和最后一个样本之后信号中没有定义点。您可以复制它们或镜像下一点(镜像更好)。
- 整个过程可以改为连续处理,无需缓冲区,只需记住信号中的最后 4 个点,这样您就可以在 RT 中执行此操作。粗略地说,您将被延迟 2-3 个 75.0 Hz 样本……当您将所有这些放在一起时,您会发现这是一个 FIR 滤波器:)
- 如果你需要保留更多,那么一阶导数添加更多点......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)