首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用步长在正弦表中找到音调频率?STM32

如何使用步长在正弦表中找到音调频率?STM32
EN

Stack Overflow用户
提问于 2015-11-08 11:06:39
回答 1查看 431关注 0票数 0

我正在尝试使用正弦表查找方法来查找不同步长的音调频率,但当我将浮点数转换为整数并使用示波器查看频率时,它无法在屏幕上显示任何内容。

有人知道这个问题的解决方案是什么吗?任何帮助都是最好的。

代码如下:

代码语言:javascript
复制
// use the formula: StepSize = 360/(Fs/f) Where Fs is the Sample frequency 44.1 kHz and f is the tone frequency.
// example: StepSize = 360/(44100/440) = 3.576, since the STM32 doesn't support the floating point, therefore, we have to use the fixed-point format which multiply it by 1000 to be 3575

int StepSize = 3575;  
unsigned int v=0;

signed int sine_table[91] = {
          0x800,0x823,0x847,0x86b,
          0x88e,0x8b2,0x8d6,0x8f9,
          0x91d,0x940,0x963,0x986,
          0x9a9,0x9cc,0x9ef,0xa12,
          0xa34,0xa56,0xa78,0xa9a,
          0xabc,0xadd,0xaff,0xb20,
           0xb40,0xb61,0xb81,0xba1,
           0xbc1,0xbe0,0xc00,0xc1e,
           0xc3d,0xc5b,0xc79,0xc96,
           0xcb3,0xcd0,0xcec,0xd08,
            0xd24,0xd3f,0xd5a,0xd74,
            0xd8e,0xda8,0xdc1,0xdd9,
            0xdf1,0xe09,0xe20,0xe37,
            0xe4d,0xe63,0xe78,0xe8d,
            0xea1,0xeb5,0xec8,0xedb,
            0xeed,0xeff,0xf10,0xf20,
            0xf30,0xf40,0xf4e,0xf5d,
            0xf6a,0xf77,0xf84,0xf90,
            0xf9b,0xfa6,0xfb0,0xfba,
            0xfc3,0xfcb,0xfd3,0xfda,
            0xfe0,0xfe6,0xfec,0xff0,
            0xff4,0xff8,0xffb,0xffd,
            0xffe,0xfff,0xfff};

unsigned int sin(int x){
   x = x % 360;
   if(x <= 90)
      return sine_table[x];
    else if ( x <= 180){
      return sine_table[180 - x];
    }else if ( x <= 270){
      return 4096 - sine_table[x - 180];
    }else{
      return 4096 - sine_table[360 - x];
     }
}

void main(void)
{
while(1){
            v+=StepSize;                // Don't know why it doesn't work in this way. not display anything on screen.
           DAC->DHR12R2 = sin(v/1000);      // DAC channel-2 12-bit Right aligned data
           if (v >= 360) v = 0;
           }
}

但是,如果我更改StepSize =3,它将显示频率:

EN

回答 1

Stack Overflow用户

发布于 2015-11-08 20:45:54

你的代码有一些问题。但我会从你问到的那个开始。

代码语言:javascript
复制
int StepSize = 3575;  
unsigned int v=0;
while(1){
       v+=StepSize;
       DAC->DHR12R2 = sin(v/1000);
       if (v >= 360) v = 0;
}

这段代码不起作用的原因是,v总是在循环结束时设置为0,因为3575大于360。所以你总是调用sin(3),因为3575/1000integer division中是3

也许,您应该将最后一行重写为if ((v/1000) >= 360) v = 0;。否则,我会像这样重写你的循环

代码语言:javascript
复制
while(1){
       v+=StepSize;
       v/=1000;
       DAC->DHR12R2 = sin(v);
       if (v >= 360) v = 0;
}    

我还建议您将查找表声明为const。所以看起来就像

代码语言:javascript
复制
const signed int sine_table[91] = {

最后一个建议是为您的sin函数选择另一个名称,以免与sin library function混淆。尽管在这种情况下应该不会有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33590292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档