Morgoth
Captain
- Registriert
- Juli 2002
- Beiträge
- 3.889
Nabend zusammen,
ich bastel mir ein kleines Audiomessprogramm, dass auf logarithmischen Sweeps basiert. Warum ist nicht wichtig, wens genauer interessiert kann nachfragen.
Auf der Arbeit habe ich etwas ähnliches verwirklicht, allerdings mit Hilfe von Agilent Vee (sowas wie LabView), und ich möchte es für mich selber komplett in C entwickeln (Vee ist mir entschieden zu teuer). Der Sweep wird dort allerdings auch über eine C-Routine (als DLL eingebunden) verwirklicht.
Vielleicht noch kurz angeschnitten, was ein logarithmischer Sweep ist: im Gegensatz zu einem linearen Sweep steigt die Frequenz nicht mit konstanter Geschwindigkeit, sondern exponentiell an, Vogelgezwitscher ähnlich (zumindest des Vogels, der jeden Morgen um 5:00 so freundlich ist, mich zu wecken
)
Als erstes mal der Code, leicht abgewandelte Version des auf der Arbeit verwendeten, macht aber keinen Unterschied, das Original habe ich auch geprüft:
Man beachte die erklärenden Kommentare.
Und eigentlich sollte dabei eine Schwingung konstanter Amplitude herauskommen. Tut es aber nicht. Statt dessen steckt da eine Modulation drin, die ich aber auch nicht richtig zuordnen kann. Es ist eine Amplitudenmodulation, aber kein Aliasing (denke ich, sieht mir nicht danach aus), wie man es bei zeitdiskreten Signalen erwarten könnte.
Ein Beispiel habe ich mal angehängt. Es ist ein Sweep mit 131072 (2^18) Samples bei einer Abtastrate von 48kHz, Startfrequenz 20Hz, Stopfrequenz 20kHz.
Ein Programmfehler kanns nicht sein, denn der gleiche Code leistet bei mir auf der Arbeit gute Dienste. Es ist auch kein Darstellungsfehler, hören kann man es auch.
Kompiliert wurde es hier unter FreeBSD 6.0 mit dem gcc 3.4.4. Das kanns aber auch nicht sein, denn unter Windows (XP) mit MingW (Version weiß ich leider nicht, war bei der Bloodshed-IDE dabei) habe ich hier das gleiche Problem. Aber nicht auf der Arbeit - ebenfalls Windows (2k) und MinGW (gleiche IDE => gleiche Compilerversion).
Wirkliche Unterschiede gibt es eigentlich nur bei der Hardware. Hier ein P4 2,53 GHz, dort ein Celeron 2,4GHz sowie ein Athlon TB 1100.
Das war alles. Und ich weiß echt nicht mehr weiter. Hat einer von Euch vielleicht eine Idee?
Edit:
Habe den Code mal gerade auf einem Duron 900 getestet. Ebenfalls dieser Fehler.
Gruß
Morgoth
ich bastel mir ein kleines Audiomessprogramm, dass auf logarithmischen Sweeps basiert. Warum ist nicht wichtig, wens genauer interessiert kann nachfragen.
Auf der Arbeit habe ich etwas ähnliches verwirklicht, allerdings mit Hilfe von Agilent Vee (sowas wie LabView), und ich möchte es für mich selber komplett in C entwickeln (Vee ist mir entschieden zu teuer). Der Sweep wird dort allerdings auch über eine C-Routine (als DLL eingebunden) verwirklicht.
Vielleicht noch kurz angeschnitten, was ein logarithmischer Sweep ist: im Gegensatz zu einem linearen Sweep steigt die Frequenz nicht mit konstanter Geschwindigkeit, sondern exponentiell an, Vogelgezwitscher ähnlich (zumindest des Vogels, der jeden Morgen um 5:00 so freundlich ist, mich zu wecken
Als erstes mal der Code, leicht abgewandelte Version des auf der Arbeit verwendeten, macht aber keinen Unterschied, das Original habe ich auch geprüft:
Code:
double* gen_sweep(double time, int SampleRate, double fstart, double fstop, int* samples)
{
double K, L, T;
double *output;
int t;
// die Anzahl der Samples wird auf eine Potenz von 2 festgelegt
// um die in anderen Programmteilen benutzten FFTs zu beschleunigen
*samples=(int)ceil(log10(time*SampleRate)/log10(2.0));
*samples=(int)pow(2.0, *samples);
T=(double)(*samples)/SampleRate;
output=(double*)malloc((*samples)*sizeof(double));
// Berechnung der Koeffizienten K und L
// skaliert auf die Abtastrate
L=SampleRate*T/log(fstop/fstart);
K=L*2*M_PI*fstart/SampleRate;
// Erzeugung des Sweeps
for (t=0;t<(*samples);t++)
{
output[t]=sin(K*(exp(t/L)-1.0));
}
return output;
}
Man beachte die erklärenden Kommentare.
Und eigentlich sollte dabei eine Schwingung konstanter Amplitude herauskommen. Tut es aber nicht. Statt dessen steckt da eine Modulation drin, die ich aber auch nicht richtig zuordnen kann. Es ist eine Amplitudenmodulation, aber kein Aliasing (denke ich, sieht mir nicht danach aus), wie man es bei zeitdiskreten Signalen erwarten könnte.
Ein Beispiel habe ich mal angehängt. Es ist ein Sweep mit 131072 (2^18) Samples bei einer Abtastrate von 48kHz, Startfrequenz 20Hz, Stopfrequenz 20kHz.
Ein Programmfehler kanns nicht sein, denn der gleiche Code leistet bei mir auf der Arbeit gute Dienste. Es ist auch kein Darstellungsfehler, hören kann man es auch.
Kompiliert wurde es hier unter FreeBSD 6.0 mit dem gcc 3.4.4. Das kanns aber auch nicht sein, denn unter Windows (XP) mit MingW (Version weiß ich leider nicht, war bei der Bloodshed-IDE dabei) habe ich hier das gleiche Problem. Aber nicht auf der Arbeit - ebenfalls Windows (2k) und MinGW (gleiche IDE => gleiche Compilerversion).
Wirkliche Unterschiede gibt es eigentlich nur bei der Hardware. Hier ein P4 2,53 GHz, dort ein Celeron 2,4GHz sowie ein Athlon TB 1100.
Das war alles. Und ich weiß echt nicht mehr weiter. Hat einer von Euch vielleicht eine Idee?
Edit:
Habe den Code mal gerade auf einem Duron 900 getestet. Ebenfalls dieser Fehler.
Gruß
Morgoth
Anhänge
Zuletzt bearbeitet: