代码之家  ›  专栏  ›  技术社区  ›  miXo

如何使用整数除法降低采样率?

  •  1
  • miXo  · 技术社区  · 6 年前

    我想将我的基频F(80000 Hz)降低 仅使用整数除法的任意分数 .

    假设使用频率F调用new\u sample()函数。然后我可以使用下面的代码将采样率降低到40000 Hz。

    i = 0; // global counter
    new_sample(value){
        if(i % 2 == 0){
            add_sample_to_buffer(value);
        }else{
            // skip sample
        }
        i++;
    }
    

    如果我想将采样率降低1.6到50000 Hz的系数,该怎么办?

    正如Clifford所指出的:我想在不改变频率的情况下改变采样率。基本上,我想通过跳过一些实时采样来降低信号的采样率。

    附笔。: 我知道预分频器和后分频器通常用来降低频率。我不知道他们是否允许将频率降低一小部分。

    2 回复  |  直到 6 年前
        1
  •  1
  •   user5329483    6 年前

    尝试以下操作:

    unsigned Nanoseconds = 0; // global counter
    
    void new_sample(value){
        Nanoseconds += 12500; // interval between calls at 80000 
        if(Nanoseconds>20000){
            Nanoseconds-=20000;
            add_sample_to_buffer(value);
        }else{
            // skip sample
        }
    }
    

    在一秒钟内 Nanoseconds 将增加80000倍乘以12500,等于1E9,并将减少50000倍乘以20000。

        2
  •  1
  •   VladP    6 年前

    如果要更改信号的采样率,而不更改信号内容的绝对位置,则需要执行信号处理中称为“抽取”的操作。如果你想了解它,你可能希望阅读这篇非常密集的大学演讲: https://homepages.wmich.edu/~bazuinb/ECE6560/CR_DecAndInterp.pdf . 简而言之,您必须执行一些过滤、一些抽取以及一些插值。更简单的解释如下: https://dspguru.com/dsp/faqs/multirate/decimation/ ,它确实有一个指向scopeFIR免费工具的链接,该工具包括抽取阶段过滤器以及源代码。大量阅读,我知道。。。