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
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.
Am besten geht das mit Matlab oder Octave: [y,fs,bits] = wavread("c:\deinwavfile.wav"); max(y);
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 |
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.
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
Hey Leutz, weiss einer von euch detaillieret wie man an die Amplitudenwerte von ner Wavedatei kommt (am besten in C/C++) gruß Fabian
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.