Hallo alle zusammen!
Ich möchte mir einen Sinuston bauen. Die Länge der PCM Information (Länge des Wellenabschnitts) und Frequenz (Höhe des Tons) sollte dabei variabel sein.
Das ganze sollte Stereo in 44,1kHz rauskommen.
Jetzt soll das noch geloopt werden, sodass wenn ich 1/10tel Sekunde PCM Daten erzeugt habe, diese dann wiederholt wird, sodass ich einen ewig langen Sinuston habe.
Problem auf das ich hier gestoßen bin, ist die Berechnung des Sinus.
Hier den Code den ich für die Berechnung verwende:
Problem ist, das bei 17640 Schleifenaufrufen und einen gerundeten 2*PI die Sinuskurve nicht genau bei 0 endet, was zu einem Knacksen beim loop führt.
Meine Fragen:
Hat irgendjemand einwände was die Berechnung der Samples angeht? Ich bin neu auf diesem Gebiet und somit noch etwas frisch in der Tonberechnung :| .
Wie kann ich den Sinus an der Stelle so berechnen, das ich bei 17640 Samples am Ende auf meine 0 komme?
Ich möchte mir einen Sinuston bauen. Die Länge der PCM Information (Länge des Wellenabschnitts) und Frequenz (Höhe des Tons) sollte dabei variabel sein.
Das ganze sollte Stereo in 44,1kHz rauskommen.
Jetzt soll das noch geloopt werden, sodass wenn ich 1/10tel Sekunde PCM Daten erzeugt habe, diese dann wiederholt wird, sodass ich einen ewig langen Sinuston habe.
Problem auf das ich hier gestoßen bin, ist die Berechnung des Sinus.
Hier den Code den ich für die Berechnung verwende:
C++:
// create sinus chunk
// sample rate
_sampleRate = 44100;
// PCM format 0x01
_dataFormat = 0x01;
// stereo
_channelCount = 2;
// bits per sample
_bitsPerSample = 16;
// framesize = (bytes/sample) * channel count
_frameSize = _channelCount * (_bitsPerSample/8);
// => 441000 * 4 = 176400 bytes/sec
_bytesPerSecond = _sampleRate * _frameSize;
// 1/10th of a second
int samples = _bytesPerSecond/10;
if(!_data)
_data = new int16_t[samples];
_dataLenght = samples;
const double pi = 4*atan(1.f);
for(int i=0;i<samples;i+=_channelCount) {
double s = (i/_sampleRate) * (2*pi*value);
for(int j=0;j<_channelCount;j++) {
_data[i+j] = sin(s) * 10000;
}
}
return true;
Problem ist, das bei 17640 Schleifenaufrufen und einen gerundeten 2*PI die Sinuskurve nicht genau bei 0 endet, was zu einem Knacksen beim loop führt.
Meine Fragen:
Hat irgendjemand einwände was die Berechnung der Samples angeht? Ich bin neu auf diesem Gebiet und somit noch etwas frisch in der Tonberechnung :| .
Wie kann ich den Sinus an der Stelle so berechnen, das ich bei 17640 Samples am Ende auf meine 0 komme?
Zuletzt bearbeitet: