上采样的正确方法是什么?

时间:2014-09-30 14:27:24

标签: c math signal-processing sampling resampling

我有一个75 Hz的样本数组,我想以128 Hz的频率存储它们。如果它是64赫兹和128赫兹,它非常简单,我只会加倍所有样品。但是,如果采样率不是彼此的一小部分,那么正确的方法是什么?

4 个答案:

答案 0 :(得分:3)

如果您想避免过滤,那么您可以:

  1. 处理信号作为连接插值立方体曲线的集合

    但这一点与使用线性插值相同。在不了解您的信号和目的的情况下,您无法构建valid系数(不会损害信号准确性),例如如何构建这样的立方体外观:

    在该链接中的子弹#3 中是我使用的系数。我认为即使你的目的也足够了,所以你可以尝试一下。如果你想做自定义插值,请看这里:

  2. 创建可以从采样开始给定时间内返回信号点的功能

    这样做

    double signal(double time);
    

    其中time是从采样开始的[s]中的时间。在此函数内部计算您需要访问的4个样本。

    ix = floor(time*75.0);
    

    给出曲线起点样本索引。立方体在曲线前需要4个点,在曲线前需要1个...因此对于插值立方点p0,p1,p2,p3使用样本ix-1,ix,ix+1,ix+2。计算三次系数a0,a1,a2,a3并计算三次曲线参数t(我使用范围<0,1>)所以

    t=(time*75.0); t-=floor(t);
    

    enter image description here

    • 绿色 - 实际曲线段
    • aqua - 实际曲线段控制点= 75.0 Hz样本
    • 红色 - 曲线参数插值参数t
    • 灰色 - 实际时间
    抱歉,我忘了绘制实际输出信号点应该是绿色和灰色的交点

  3. 只需循环显示采样数据,时间步长为1/128秒

    类似的东西:

    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的样本中的输入信号数组大小

  4. <强> [注释]

    • for / duration可以在整数上完成......
    • 将信号数据类型更改为您需要的信息
    • signal(time)内你需要处理边缘情况(信号的开始和结束)
    • 因为您在第一个样本之前和最后一个样本之后没有定义信号点。您可以复制它们或镜像下一个点(镜像更好)。
    • 这整个事情可以改变为连续处理而不需要缓冲区只需要记住信号中的4个最后一个点,这样你就可以在RT中完成。在粗略的情况下,您将延迟2-3个75.0 Hz样本...当您将所有这些放在一起时,您将看到这是一个FIR滤波器:)
    • 如果你需要保留更多,那么首先推导出更多点......

答案 1 :(得分:2)

您不需要上采样然后下采样。

相反,可以使用足够宽的低通插值内核(例如窗口Sinc函数)以所需的时间间隔插入所有新采样点。这通常通过使用预先计算的多相滤波器组直接或通过滤波器表的附加线性插值来完成。但如果性能不重要,那么可以直接计算每个插值点的每个系数。

答案 2 :(得分:1)

最简单的方法是上采样到采样率,这是两个采样率的LCM然后下采样 - 这样就可以获得整数上采样/下采样比率。在您的情况下,两个采样率中没有共同因素,因此您需要上采样128到9.6 kHz,然后下采样75到128 Hz。对于上采样,在每个样本之间插入127 0个样本,然后应用合适的滤波器(37 Hz LPF,Fs = 9.6 kHz),然后通过取每75个样本进行下采样。过滤器设计是唯一棘手的部分,但有一些在线工具可以解决这个难题。

或者查看处理重新采样的第三方库,例如: sox

答案 3 :(得分:0)

您需要使用中间采样频率进行上采样和下采样,如@Paul所述。此外,需要在每次变换后对信号进行滤波,这可以通过线性插值来实现:

% Parameters
F = 2;
Fs1 = 75;
Fs3 = 128;
Fs2 = lcm(Fs1,Fs3);

% Original signal
t1 = 0:1/Fs1:1;
y1 = sin(2*pi*F*t1);

% Up-sampled signal
t2 = 0:1/Fs2:1;
y2 = interp1(t1,y1,t2);

% Down-sampled signal
t3 = 0:1/Fs3:1;
y3 = interp1(t2,y2,t3);

figure;
subplot(3,1,1);
plot(t1,y1,'b*-');
title(['Signal with sampling frequency of ', num2str(Fs1), 'Hz']);
subplot(3,1,2);
plot(t2,y2,'b*-');
title(['Signal with sampling frequency of ', num2str(Fs2), 'Hz']);
subplot(3,1,3);
plot(t3,y3,'b*-');
title(['Signal with sampling frequency of ', num2str(Fs3), 'Hz']);

enter image description here