Also der Source-Code ließ sich hervorragend implementieren. Er ist enorm schneller als FFT, liefert auch bessere Werte. Jedoch variieren diese immernoch, was ich mir nicht erklären kann. Mit einem Testgenerator lasse ich stets die gleiche Folge über die Soundkarte laufen, und immer sind die Werte unterschiedlich. Zudem besteht noch das Timerproblem. Ich hab's mit dem MMTimer versucht. Auf 1ms eingestellt (minimum). Folge: Programm friert ein, Rechner am Boden.....Stelle ich den Wert auf 3 ms, so bekomme ich augenscheinlich nur jeden 3. Wert. Eigentlich müsste ich ja unter 0,8 ms um ordentlich Werte zu erzielen.
Auf jeden Fall erstmal vielen Dank für den Source und die äußerst ausführliche Erklärung.
Es muss doch irgendwie eine Möglichkeit geben das Ganze in (annäherend) Echtzeit laufen zu lassen. Schließlich dauert das ja wohl nicht so lange ein Array der Größe 44000 mit Werten zu füllen. Und schon garnicht auf heutigen Rechnern-....Was mache ich nur falsch?
Hier mal die Analyse:
Delphi-Quellcode:
function RecordingCallback():TData;
var
Samples: TData;
r_a,r_b: Double;
aX,aY,aX_B,aY_B: Double;
rX,rY,rX_B,rY_B: Integer;
cX,cY,cX_B,cY_B: Integer;
I,l: integer;
begin
BASS_ChannelGetData(Channel, @Samples,44000);
result:=Samples;
aX := 0;
aY := 0;
rX := -1;
rY := -1;
cX := 0;
cY := 9;
for I := 36 to 36*2 do
begin
aX := aX - Samples[I - 36] * rX;
aY := aY - Samples[I - 36] * rY;
aX := aX + Samples[I] * rX;
aY := aY + Samples[I] * rY;
Inc(cX);
if cX >= 18 then
begin
cX := 0;
rX := -rX;
end;
Inc(cY);
if cY >= 18 then
begin
cY := 0;
rY := -rY;
end;
r_a := Sqrt(Sqr(aX) + Sqr(aY));
end;
form1.Edit1.Text:=FloatToStr(r_a);
if r_B > 4 THEN
BEGIN
cou:=cou+1;
form1.Edit2.Text:=IntToStr(cou);
END;
aX_B := 0;
aY_B := 0;
rX_B := -1;
rY_B := -1;
cX_B := 0;
cY_B := 6;
for I := 24 to 24*2 do
begin
aX_B := aX_B - Samples[I - 24] * rX_B;
aY_B := aY_B - Samples[I - 24] * rY_B;
aX_B := aX_B + Samples[I] * rX_B;
aY_B := aY_B + Samples[I] * rY_B;
Inc(cX_B);
if cX_B >= 12 then
begin
cX_B := 0;
rX_B := -rX_B;
end;
Inc(cY_B);
if cY_B >= 12 then
begin
cY_B := 0;
rY_B := -rY_B;
end;
r_B := Sqrt(Sqr(aX_B) + Sqr(aY_B));
if r_B > 4 THEN
BEGIN
cou:=cou+1;
form1.Edit3.Text:=IntToStr(cou);
END;
end;
end;
Der Timer ruft obige Funktion alle X-ms auf.
Hier die Record-Initialisierung:
Delphi-Quellcode:
procedure StartRecording();
begin
BASS_ChannelStop(Channel);
// Nil or @ThresholdRecorder
Channel:=BASS_RecordStart(44000, 2,BASS_SAMPLE_FLOAT,nil, 0); //BASS_RECORD_PAUSE
if Channel=0 then
begin
Error('Couldn''t start recording');
Exit;
end;
//BASS_ChannelPlay(Channel, false);
end;