c - 正弦近似

标签 c

<分区>

我正在尝试仅使用整数而不使用表格来近似 sin 函数。

每一步都会调用该函数。我已经在 matlab 中成功地对其进行了近似,但是我的 C 代码中出现了错误。出于某种原因,我得到了错误的频率读数,并且该功能不适用于所有频率。

typedef volatile struct tone_s{
    int32_t impulse;
    int32_t acceleration; 
    int32_t rollover;
    int32_t velocity;
    int32_t phase;
    int32_t counter; 
    int32_t position_acc; 
    int32_t velocity_acc; 
}tone_t; 

static void Osc_Init(tone_t *osc, uint32_t frequency, uint32_t sample_rate){
    int32_t max_int = (1UL << 16); 
    frequency *= 4UL; 

    osc->impulse = (max_int * frequency);
    osc->acceleration = max_int/sample_rate * frequency * frequency;
    osc->rollover = (sample_rate * 2UL / frequency);
    osc->velocity = osc->impulse - (osc->acceleration / 2UL);
    osc->velocity_acc = osc->velocity; 
    osc->phase = -1UL;
    osc->counter = 0; 
    osc->position_acc = 0; 

}

#include <stdio.h>

static int16_t Osc_GenSample(tone_t *osc){
    if(osc->counter == osc->rollover){
        osc->velocity_acc = osc->velocity;
        osc->position_acc = 0;
        osc->phase = -osc->phase;
        osc->counter = 0; 
    }

    int32_t sample = (osc->position_acc / 4194304UL) * osc->phase;

    osc->position_acc += osc->velocity_acc;  
    osc->velocity_acc -= osc->acceleration; 

    osc->counter++; 

    //fprintf(stdout, "%d - %d %d %d %d %d %d %d\n", sample, osc->impulse, osc->acceleration, osc->velocity, osc->rollover, osc->position_acc, osc->velocity_acc, osc->counter); 
    return sample; 
}

也许我把它复杂化了。

最佳答案

参见 Hakmem items 149 to 152了解用很少的算术增量绘制圆(当然给出正弦)的方法。

关于c - 正弦近似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200717/

相关文章:

c - C 中的正则表达式 - 搜索信用卡号 - PCI 合规性

检查 charArray 是否只有十六进制数字

c - 使用 C 宏在代码中很好地组合两个选项

c - 这个 C 语言的反向字符串函数写得不好吗?/如何使这段代码更好?

c - 在 C 中的 for header 的第一部分中使用条件而不是赋值

c - C 中的 puts 和 printf

c - 在 C 中以更高的精度存储数字

c - TCP 客户端无法将字符串发送到服务器

c - 字符串连接错误与 malloc 动态内存分配

c - 试图在 c 中打印一行文本文件