2015-11-08 11 views
0

Я пытаюсь использовать метод поиска таблицы Sine, чтобы найти частоту тона при разных размерах шага, но когда я конвертирую с плавающей точкой в ​​целое число и использую oscicopte для просмотра frequncy, он не может отображать любые вещи на экране.Как использовать размер шага, чтобы найти частоту тона в таблице синусов? STM32

Кто-нибудь знает, в чем проблема для решения этой проблемы. Любая помощь - apperaite.

Ниже приведен код:

// 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; 
      } 
} 

enter image description here

Но, если я изменить размер шага = 3; он показывает частоту:

enter image description here

ответ

0

Есть несколько проблем с вашим кодом. Но я начну с той, о которой вы спросили.

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/1000 является 3 в integer division.

Возможно, вам необходимо переписать свою последнюю строку как if ((v/1000) >= 360) v = 0;. В противном случае, я бы переписать цикл, как этот

while(1){ 
     v+=StepSize; 
     v/=1000; 
     DAC->DHR12R2 = sin(v); 
     if (v >= 360) v = 0; 
}  

Я также рекомендовал бы вам объявить таблицу const поиска. Так это будет выглядеть

const signed int sine_table[91] = { 

Последняя рекомендация, чтобы выбрать другое имя для sin функции так, чтобы не путать с sin library function. Хотя в этом случае не должно быть проблем.