Фактические образцы синусоидальной волны генерируются и заполняют буфер во фрагменте ниже
for (UInt32 frame = 0; frame < inNumberFrames; frame++)
{
buffer[frame] = sin(theta) * amplitude;
theta += theta_increment;
if (theta > 2.0 * M_PI)
{
theta -= 2.0 * M_PI;
}
}
В строке, где назначается buffer[frame]
, вы вызываете sin(theta) * amplitude
, и для каждогоитерации цикла for
, вы увеличиваете theta
на некоторый конечный размер шага, основанный на вашей частоте и частоте дискретизации, через
double theta_increment = 2.0 * M_PI * viewController->frequency / viewController->sampleRate;
, который по существу делит 2.0 * PI * frequency
на вашу частоту дискретизации.
Увеличение переменной theta
во время цикла по циклу for
в основном продвигает шаг по времени на одну выборку за раз, пока ваш буфер не заполнится (т. Е. frame == iNumberFrames
).
Если выЕсли вы хотите сгенерировать что-то, кроме синусоидальной волны, вы просто замените следующую строку какой-нибудь другой функцией:
buffer[frame] = sin(theta) * amplitude;
Т.е., скажем, например, вы хотели первые три члена в бесконечных рядах Фурье, которыесходится к треугольной волне;Вы могли бы тогда иметь следующее ...
buffer[frame] = (8 / pow(M_PI,2)) * (sin(theta) - sin(3*theta)/9 + sin(5*theta)/25);