Как правильно согнуть заметку в приложении для синтеза звука? - PullRequest
3 голосов
/ 20 декабря 2011

Проблема

Я пытаюсь некоторое время разобраться с этим, но безрезультатно - как постоянно изменять высоту ноты между двумя частотами.

Я генерирую аудиосигнал с помощью функции, подобной этой:

double SineGenerator(double time, double frequency)
{
    return Math.Sin(frequency * time * 2 * Math.PI);
}

Пока я управляю временем вручную вне этой функции, вот так:

time += 1.0 / sampleRate;
double sample = SineGenerator(time, frequency);

И очевидное решениеЛинейная интерполяция параметра frequency по требуемому количеству выборок не работает должным образом.При этом звуковая волна заполняется хлопками и щелчками.

Как мне вместо этого реализовать это?

Решение (Редактировать)

БлагодаряЭто было удивительно легко решить.Сейчас я перешел на использование этого генератора:

double SineGenerator(ref double time, double frequency, int sampleRate)
{
    return Math.Sin(time += (frequency * 2 * Math.PI) / sampleRate);
}

, который заботится о внутреннем увеличении time.

Использование этого генератора с интерполяцией frequency работает плавно и без проблем со звуком.Спасибо!

1 Ответ

4 голосов
/ 20 декабря 2011

Вместо умножения frequency на time используйте frequency для увеличения time на соответствующую величину. Таким образом, time будет непрерывным, и вы не получите прыжков.

...