Экспоненциальная итерация в заданный диапазон c - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно перебрать в заданный диапазон c с линейными и экспоненциальными шагами. Линейные шаги не проблема, но с экспоненциальной я не знаю, что нужно для номинатора.

//Linear:
start = 20;
end = 200;
sampleRate = 1000;
duration = 1;
while(1)
{
   delta = (end - start) / (sampleRate * duration);
// 0.18  = (200 - 20)    / (1000       * 1);
   f += delta
   if(f >= end)
      f = start;
}
//Exponential
while(1)
{
   delta = /*???*/ / (sampleRate * duration);
   f += delta
   if(f >= end)
      f = start;
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Хорошо, я нашел ответ.

Первый раз, когда вы хотите установить два диапазона. Прежде всего, это оригинальный диапазон в линейной шкале. Второе - диапазон в целевом логарифмическом масштабе c. На мой вопрос:

[начало ==================== конец]

[firstSample ======== ====== sampleRate * Duration]

Затем вы хотите рассчитать разговор по формулам. Я пишу это на Desmos: https://www.desmos.com/calculator/utb5nu1pvq

И мой код:

SinSweep()
    {

    start=20;
    end=200; 
    sampleRate=1000;
    range=end-start; 
    sampleCount=sampleRate*duration;
    logMax=log10f(end/start);
    currentSample=0;
    f=start;

    While(1){
        switch (type) {
        case Linear:
            f = (((currentSample-1)/sampleCount)*range)+start;
            break;
        case Logarithmic:
            f = start*(powf(10, logMax*(currentSample/sampleCount)));
            break;
            }
    currentSample++;

    if(f >= end){
        f = start;
        currentSample = 0;
        }
    }
}
0 голосов
/ 27 марта 2020

Для экспоненциального изменения необходимо умножить числитель на некоторый коэффициент в каждой итерации.

//Exponential
range = end - start;
expFactor = 1.5; //Choose this according to your requirement
while(1)
{
   delta = range / (sampleRate * duration);
   f += delta
   if(f >= end)
      f = start;
   range *= expFactor;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...