Logarithmischer Sinussweep - und irgendetwas stimmt hier nicht

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 :utminigun: )

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

  • sweep.png
    sweep.png
    17,5 KB · Aufrufe: 334
Zuletzt bearbeitet:
So, das Problem ist zwar nicht gelöst, aber geklärt. Es hat nichts mit meiner Programmierung zu tun, auch nicht mit dem Prozessor. Und durch genaueres hinschauen wäre mir aufgefallen, dass auch auf der Arbeit diese "Dellen" im Sweep zu sehen sind. Offensichtlich ist das einfach so.

Was ich gehört habe waren nicht die "Dellen", sondern eine Hardwareangelegenheit, und ich könnte mich an die Wand nageln, warum ich das nicht schon eher getestet habe.

Bisher hatte ich immer eine Samplingfrequenz von 48kHz genommen, in der Annahme, dass mit dieser meine Soundkarte (Terratec SixPack) intern arbeitet. Tut sie aber ganz offensichtlich nicht, sondern nur mit 44,1kHz. Die hörbaren Artefakte kommen, so meine jetzige Erklärung, vom Resampling, was wohl äußerst miserabel ausgeführt ist.

Woraus sich folgendes ergibt: ich brauche eine andere Soundkarte. (Und zwar eine die intern nativ mit 96kHz arbeitet und 24-Bit Wortbreite unterstützt - alles andere taugt nichts für meine Zwecke).

Gruß
Morgoth
 
Zurück
Oben