Forum: PC-Programmierung Peaks auslesen und umrechnen


von Fabian W. (hellwalker)


Lesenswert?

Hey Leute,

Ich hätt da mal ne Frage.
Gibt es eine Möglichekeit aus einer Wave-Datei den höchsten Peak 
auszulesen und diesen auszugeben und könnte man mit dem Wert als 
Parameter weiterrechnen.

Die Sache is nämlich die: Ich muss in meiner Facharbeit ein 
Schallpegelmessgerät bauen und mit dem dann ein paar Praxistests 
durchführen. Des ganze lasse ich aus Kostengründen über meinen Laptop 
laufen. Über ein kleines Elektretmikrophon nehm ich dann mit Audacity 
oder irgendeinem anderen Ding ne Wave/Mp3 von dem Gerät das ich messen 
will auf. (z.b. Dieselagregat, Automotor....)
Jetzt will ich ein Programm schreiben, das mir dann den Schalldruckpegel 
berechnet den ich in meiner Audiodatei "gespeichert" habe.
Die Formel für die Rechnung hab ich schon aufgestellt ich brauch also 
jetzt"nur" noch den Spannungswert den mein Mikro bei der Schallquelle 
abgibt, um ihn dann als Parameter in diese Rechnung einsetzen zu können.
Da ich mein Programm nur auf meinen Laptop laufen lassen kann und den 
Mixer nicht verstelle genügt mir die Kalibrierung über einen 
Tonfrequenzgenerator. Mit ihm werde ich auch dann versuchen die Theorie 
zu belegen (Abstandsgesetz....).

Also nochmals meine Frage ist es irgendwie möglich an die Peaks bzw die 
Spannungswerte des Mikros bzw denen der Audiodatei zu gelangen.


Liebe Grüße
hellwalker

von Karl H. (kbuchegg)


Lesenswert?

Fabian Wegmann schrieb:

> Ich hätt da mal ne Frage.
> Gibt es eine Möglichekeit aus einer Wave-Datei den höchsten Peak
> auszulesen und diesen auszugeben und könnte man mit dem Wert als
> Parameter weiterrechnen.

In einer WAV Datei stehen die Amplitudenmesswerte direkt drinnen.
File auf - Header auslesen um die Kennzahlen des Files zu kriegen - 
Samples durchsuchen und den größten/kleinsten Wert nehmen.

> Also nochmals meine Frage ist es irgendwie möglich an die Peaks bzw die
> Spannungswerte des Mikros bzw denen der Audiodatei zu gelangen.

File auf - Bytes lesen.

von Timmo H. (masterfx)


Lesenswert?

Am besten geht das mit Matlab oder Octave:
[y,fs,bits] = wavread("c:\deinwavfile.wav");
max(y);

von HildeK (Gast)


Lesenswert?

Ich habe mal den Fileheader eines WAV-Files untersucht. In einem 
C-Programm würde die Information z.B. so in Variablen passen. Nach dem 
Header kommen dann die Daten (Anzahl in Bytes: lCountOfBytes), bei 16bit 
Stereo je zwei Byte linker Kanal, dann zwei Byte rechter Kanal, also 4 
Byte pro Samplezeitpunkt. Bei 8bit Mono dann eben nur ein Byte pro 
Samplezeitpunkt. Man sollte nach lCountOfBytes aufhören mit Lesen, denn 
danach können noch andere Infos stehen, z.B. CD-Text oder eine Signatur 
des Audiobearbeitungsprogramms ...
Die kann man lesen und auswerten - es sind ganz normale PCM-Werte im 
Bereich zwischen -32768 ... 32767 (0x8000 ... 0x0000 ... 0x7FFF) im Fall 
eines 16-Bit-Signals.
Zugegeben, ich habe nicht alle Teile des Headers entschlüsselt ...
1
#define DWORD unsigned long
2
#define WORD  unsigned int
3
#define BYTE  unsigned char 
4
5
struct WaveHdr1_t          
6
  { 
7
    char cRIFF[4];            // = "RIFF";        4 B   // Signatur
8
    DWORD lP;                 //                  4 B   // Dateigroesse - 8
9
    char  cWaveFmt[8];        // = "WAVEfmt ";    8 B   // Header Signatur
10
    DWORD lUnknown1;          //                  4 B   // Bedeutung?
11
    WORD  wFormatTag;         // = 0x0001;        2 B   // Bedeutung anderer Werte?
12
    WORD  wChannels;          //                  2 B   // Anzahl Kanaele
13
    DWORD lSampleRate;        //                  4 B   // Abtastrate (0xAC44 für 44.1kHz)
14
    DWORD lAvgBytePerSecond;  //                  4 B   // Sample-Rate * Block-Size
15
    WORD  wBlockSize;         //                  2 B   // Kanaele * bits/sample / 8
16
    WORD  wBitPerChannel;     //                  2 B   // Bits per Sample
17
    char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!? --> Sonderfall
18
    DWORD lCountOfBytes;      //                  4 B   // Anzahl Bytes im Datenblock    
19
  };                          // Summe:          44 Byte

von Rolf Magnus (Gast)


Lesenswert?

WAV-Files sind RIFF-Files. Die sind aus sogenannten Chunks aufgebaut. 
Jeder Chunk hat einen 4-byte-Typ, der normalerweise in Form von 4 
ASCII-Zeichen daherkommt, gefolgt von einer 4-Byte-Größe und dem Inhalt. 
Je nach Typ kann ein  Chunk auch wieder Unterchunks haben. Was du da 
umreißt, ist also gar nicht ein einzelner Header, sondern mehrere Header 
und Datenfelder, die halt normalerweise alle zusammen in der Reihenfolge 
kommen.

>    char cRIFF[4];            // = "RIFF";        4 B   // Signatur

Das ist der Chunk-Typ "RIFF".

>    DWORD lP;                //                  4 B   // Dateigroesse - 8

Größe des Chunk-Inhalts. Da Chunk-Typ und Größe zusammen 8 Bytes 
brauchen, ist der Inhalt tyischerweise genau 8 Bytes kleiner als die 
Datei.

>    char  cWaveFmt[8];        // = "WAVEfmt ";    8 B   // Header Signatur

Das sind eigentlich zwei Teile.  Das "WAVE" ist Teil des Inhalts eines 
RIFF-Chunks und gibt an, um welche Art von RIFF-File es sich handelt. 
Das "fmt " ist dann der Unter-Chunk für die Beschreibung des Formats der 
Audio-Dateien. WIMRE muß fmt immer der erste Subchunk von WAVE sein.

>     DWORD lUnknown1;          //                  4 B   // Bedeutung?

Chunk-Größe vom "fmt "-Chunk.

...

Inhalt vom fmt-Chunk ist ja soweit klar.


>     char  cData[4];           // = "data";        4 B   // hier koennte auch was 
anderes stehen!? --> Sonderfall

Hier startet der nächste Unterchunk vom WAVE-Chunk. Das kann der 
"data"-Chunk sein, der eben die Audio-Daten enthält, oder auch ein 
anderer (z.B. WAV-Tags oder irgendwelche programmspezifischen Daten). Um 
zuverlässig ein WAV-File zu lesen wird man alle Subchunks von WAVE 
durchgehen müssen und unbekannte Chunk-Typen dabei ignorieren.

>     DWORD lCountOfBytes;      //                  4 B   // Anzahl Bytes im 
Datenblock

Genauer gesagt die Größe des Inhalts vom data-Chunk.

von Fabian W. (hellwalker)


Lesenswert?

Frohe Weihnachten euch allen!

@kbuchegg

Hab mich mal an deinem Vorschlag versucht bin aber nicht großartig weit 
gekommen. Weisst du wie so etwas in C/C++ gehen könnte.

danke Fabian

von hellwalker (Gast)


Lesenswert?

Hey Leutz,

weiss einer von euch detaillieret wie man an die Amplitudenwerte von ner 
Wavedatei kommt (am besten in C/C++)

gruß Fabian

von Karl H. (kbuchegg)


Lesenswert?

Fabian Wegmann schrieb:
> Frohe Weihnachten euch allen!
>
> @kbuchegg
>
> Hab mich mal an deinem Vorschlag versucht bin aber nicht großartig weit
> gekommen. Weisst du wie so etwas in C/C++ gehen könnte.

Wenn du es mit den jetzigen Hinweisen immer noch nicht hinkriegst, dann 
gibt es nur einen Rat:
lernen, Literatur lesen, üben und in ein paar Tagen noch einmal 
probieren.

von Vlad T. (vlad_tepesch)


Lesenswert?

die frage ist, warum das ganze aufnehmen?
der Aufgabenstellung nach, hört sich das so an, als wär das ein 
Workaround um die Tatsache, dass du zu faul bist, das Mikrofon zur 
Echtzeit auszulesen.

Das Ding heißt ja Schallpegelmessgerät und nicht 
Audio-Datei-Auswertetool.

von Purzel H. (hacky)


Lesenswert?

Die Peaks auslesen ist Mist. Dann sind alle Spikes, Clicks und das 
Rauschen dabei. Zuerst sollte man das Ganze  tiefpass filtern, und dann 
die maximas un minimas finden. Das sollte aber trivial sein.
Sonst => seinlassen.

von Vlad T. (vlad_tepesch)


Lesenswert?

und ich stimme Karl-Heinz zu.
es wird dir hier niemand deine Facharbeit schreiben.
Beschäftige dich selbst mit Programmierung.
such dir ein gutes* C++ tutorial/buch und fang an dir C++ anzueignen.
wenn du die Grundlagen beherschst google, wie man auf das Mikro 
zugreift, (falls gewünscht)



* zum Thema gutes c++ Buch/tut:
Es ist leider eine Unsitte, dass in c++ Büchern/Tutorials oder sogar 
Vorlesungen zuerst mit C angefangen wird.
solltest du im Code auf den ersten Seiten sowas wie printf finden, 
schmeiß es weg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.