К сожалению, я не смог заставить метод Пола работать, но у меня есть рабочее решение для FM-синтеза аудиосигналов. Я много тестировал в Excel и понял, как это сделать. Вот алгоритм
for (i = 0; i < N; i++) {
// increase the frequency with increasing amlitudes (fc + fm)
if (input[i] < input[i+1])
out[i] = cos(acos(input[i]) + A * sin(2 * pi * mf * i));
else //decrease the frequency with decreasing amplitudes (fc - fm)
out[i] = cos(acos(input[i]) - A * sin(2 * pi * mf * i));
}
Он работает хорошо, но генерирует некоторые нежелательные гармоники (возможно, из-за ошибок округления), поэтому вам, возможно, придется использовать какой-то фильтр (скользящее среднее может хорошо справиться с уменьшением этих нежелательных гармоник). При применении к аудиосигналу вам, вероятно, придется взять огибающую аудио и умножить ее на модулирующий сигнал, чтобы не применять FM к тихим частям звука и т. Д.