#математика #аудио
Я пишу программу, которая генерирует WAV-файл, который содержит плавно меняющийся звук от частоты seq1 до seq2, частотой дискретизации sampleRate = 44100 и длинной n секунд. Необходимо найти формулу, по которой вычислять частоту текущего отрезка длинной в одно полное колебание звука, а так же общее количество отрезков frame. Текущая частота - seq = k1 * x + seq1, где k1 - скорость роста частоты, x - порядковый номер отрезка в одно полное колебание; Число семплов на отрезок - spt = sampleRate/seq = sampleRate/(k1*x+b); P.S. В принципе, можно упростить, отбросив начальную частоту, и считать по формуле spt=(sampleRate/k1)/x Насколько я понимаю, количество отрезков и прирост частоты от отрезка к отрезку должно выводиться из уравнения Но я точно не уверен. Пожалуйста, помогите извлечь количество отрезков и скорость прироста частоты. int main() { ofstream out("test.wav", ios::binary); int time = 30; waveHeaderInit(2, 44100, 16, time); waveData = new char[waveHeader.subchunk2Size]; int sequence = 100; volatile float phase; volatile int16_t sample; int maxAmplitude = pow(2, waveHeader.bitsPerSample - 1) - 1; for (int i = 0; i < time * waveHeader.sampleRate; i++) { int spt = waveHeader.sampleRate / sequence; phase = (i % spt) / float(spt); sample = sin(PI*phase)*maxAmplitude; for (int channel = 0; channel < waveHeader.numChannels; channel++) { ((int16_t*)waveData)[i*waveHeader.numChannels + channel] = sample; } } out.write((char*)&waveHeader, sizeof(waveHeader)); out.write(waveData, waveHeader.subchunk2Size); out.close(); return 0; }
Ответы
Ответ 1
Увеличивайте частоту медленно с экспоненциальной скоростью. Монотонный звук это A*sin(2Pi*B*t). Заменяем константу B на экспонету B:=C*Exp[D*t]. C*Exp[D*t0]==seq0 C*Exp[D*t1]==seq1 --- D=Ln[seq1/seq0]/(t1-t0) C=seq0*((seq0/seq1)^(t0/(t1-t0))) Получаем A*sin(2Pi*C*Exp[D*t]*t). Упрощаем t0=0, t1=T.Результат: A*sin(2Pi*seq0*((seq1/seq0)^(t/T))*t)
Комментариев нет:
Отправить комментарий