Одиночный цикл с частотой дискретизации 44,1 кГц и частотой 1 кГц в синусоиде - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать синусоидальную волну с одним циклом в c.Частота должна составлять приблизительно 1 кГц, а частота дискретизации должна составлять 44,1 кГц.Это связано с тем, что синусоидальная таблица поиска подается в микроконтроллер stm32f4, который осуществляет выборку на частоте 44,1 кГц, а затем поступает на 5 независимых ЦАП.У меня были проблемы с выяснением, как получить ровно 1 цикл волны.

В настоящее время я получаю около 10-11 циклов.

for(int j = 0; j < 45; j++){ 
    arr[j] = MAXVOLUME*((sin(2.0*PI*sineFrequency*j/44100.00)+1.0)/2.0);
}

1 Ответ

0 голосов
/ 03 марта 2019

Ваш делитель неправильный - вы хотите разделить на количество выборок, а не на частоту выборки.В связи с этим возникает проблема: для выборки ровно одного цикла с частотой 1 кГц с частотой 44,1 кГц необходимо 44,1 выборки, что не является круглым числом.Таким образом, у вас есть два варианта:

  • использовать больше выборок, чтобы получить больше циклов - например, 441 выборка даст вам 10 циклов при 1 кГц

    for(int j = 0; j < 441; j++)
        arr[j] = MAXVOLUME*((sin(2.0*PI*j/44.1)+1.0)/2.0);
    
  • отрегулируйте желаемую частоту в соответствии с выходной частотой - например, 44 выборки за 1 цикл дадут вам 1,00227 кГц при выходе с частотой 44,1 кГц

    for(int j = 0; j < 44; j++)
        arr[j] = MAXVOLUME*((sin(2.0*PI*j/44.0)+1.0)/2.0);
    
...