www.mikrocontroller.net

Forum: PC-Programmierung Peaks auslesen und umrechnen


Autor: Fabian Wegmann (hellwalker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timmo H. (masterfx)
Datum:

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

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...
#define DWORD unsigned long
#define WORD  unsigned int
#define BYTE  unsigned char 

struct WaveHdr1_t          
  { 
    char cRIFF[4];            // = "RIFF";        4 B   // Signatur
    DWORD lP;                 //                  4 B   // Dateigroesse - 8
    char  cWaveFmt[8];        // = "WAVEfmt ";    8 B   // Header Signatur
    DWORD lUnknown1;          //                  4 B   // Bedeutung?
    WORD  wFormatTag;         // = 0x0001;        2 B   // Bedeutung anderer Werte?
    WORD  wChannels;          //                  2 B   // Anzahl Kanaele
    DWORD lSampleRate;        //                  4 B   // Abtastrate (0xAC44 für 44.1kHz)
    DWORD lAvgBytePerSecond;  //                  4 B   // Sample-Rate * Block-Size
    WORD  wBlockSize;         //                  2 B   // Kanaele * bits/sample / 8
    WORD  wBitPerChannel;     //                  2 B   // Bits per Sample
    char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!? --> Sonderfall
    DWORD lCountOfBytes;      //                  4 B   // Anzahl Bytes im Datenblock    
  };                          // Summe:          44 Byte


Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian Wegmann (hellwalker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hellwalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leutz,

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

gruß Fabian

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.