[C++] .wav files vergelijken

Pagina: 1
Acties:
  • 160 views sinds 30-01-2008
  • Reageer

  • Gurdie
  • Registratie: Maart 2005
  • Laatst online: 06-11-2025
Ik moet voor een Opdracht voor school een programma in C++ maken wat 2 willekeurige .wav files met elkaar kan vergelijken. De bedoeling is dat dit programma kijkt of het patroon van de ene .wav (sample file) voorkomt in de andere .wav (complete file).

Nu heb ik op internet al een paar nuttige sites gevonden:
http://people.msoe.edu/~taylor/examples/wav.htm

http://www.codeguru.com/C.../audio/article.php/c4739/

alleen nu wordt ik hier niet echt veel wijs uit, ook niet na het lezen van het boek Aan de slag met C++.

Is er iemand die mij dit wat simpeler kan uitleggen? Of denk ik te moeilijk, dat het programma eigenlijks helemaal niks voorstelt? :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Als je programma moet kunnen omgaan met ruis, vervorming etc. is het verre van simpel (het vergelijken van audio en video files, zodat je er dus in kan zoeken, is on-going research), dus dat zal wel niet. In dat geval toch gewoon twee files inlezen en die byte voor byte vergelijken?

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Je zult vòòrdat je gaat vergelijken eerst de volgende obstakels moeten overkomen:

- Verschillen in samplerate
- Verschillen in bitdiepte
- Verschillen in frequentieafstellingen
- Verschillen in akoestiek

Pas daarna kun je een referentiemodel gaan opzetten waar je de sample mee kan gaan vergelijken. Zorg dat je als uitkomst een score krijgt, zodat je je algoritmes kunt optimaliseren.

Ik ben hier een keer eerder aan begonnen om geluidsprofielen en -matching op te zetten, maar dit is NIET makkelijk.

Download my music on SoundCloud


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Ik hoop voor je dat je enkel op exact hetzelfde stukje geluid hoeft te zoeken. Een sample die daadwerkelijk uit het orgineel geknipt is. Anders gaat het behoorlijk lastig worden en zul je met FFT's ed aan de slag moeten gaan. NOFI, maar aangezien je standaard voorbeelden van het inlezen van een wav file al redelijk onbegrijpbaar vindt hoop ik dat het enkel om het eerste gaat, en dan nog zul je het met dergelijke/deze sites moeten doen.

Is dit de eerste keer dat je met C++ gaat werken? NOFI, maar in dat geval zou ik eens overwegen of je niet een andere opdracht kan doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 9nevermind9
  • Registratie: Juli 2001
  • Laatst online: 30-12-2025
kan je niet de wav file inlezen met fread en je sample file ook
dan in de wav file gaan zoeken naar de precieze overeenkomst.

werkt alleen als de sample ergens uit de wav file komt

specs | Linux is like a Wigwam, no windows, no gates, only an apache inside!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Dan nog heb je het probleem dat het sample zelf ook een header heeft. Deze zul je er eerst af moeten slopen voordat je hem gaat vergelijken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Gurdie
  • Registratie: Maart 2005
  • Laatst online: 06-11-2025
Dit is niet de eerste keer dat ik programma's schrijf in C++, zo heb ik al programma's gemaakt waarmee ik files mee in kon lezen en bewerken.

maar de links die ik gaf ging net even boven mijn kennis van C++.

Om het makkelijk te houden is de sample gewoon een stukje uit een originele .wav file. Ik had zelf begrepen dat .wav files opgebouwd waren uit stukken binaire codes. En dat je zo de binaire code van de sample kon vergelijken met de binaire code van de originele .wav file. Correct me if I'm wrong.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Gurdie schreef op donderdag 24 november 2005 @ 14:41:
Om het makkelijk te houden is de sample gewoon een stukje uit een originele .wav file. Ik had zelf begrepen dat .wav files opgebouwd waren uit stukken binaire codes.
Is niet elke file dat? ;)

Zoals mensen hierboven al opmerkten: het is ofwel heel simpel, ofwel ontzettend complex. Aangezien er, neem ik aan, niet van je wordt verwacht dat je je in signaalanalyse verdiept, is het dus gewoon zoeken naar precies dezelfde bitreeks.

Wie trösten wir uns, die Mörder aller Mörder?


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 22-03 16:47

leuk_he

1. Controleer de kabel!

Gurdie schreef op donderdag 24 november 2005 @ 14:41:
Om het makkelijk te houden is de sample gewoon een stukje uit een originele .wav file. Ik had zelf begrepen dat .wav files opgebouwd waren uit stukken binaire codes. En dat je zo de binaire code van de sample kon vergelijken met de binaire code van de originele .wav file. Correct me if I'm wrong.
Ja, als je de header van de sample hebt afgeknipt wel, je wil alleen de data vergelijken, niet de header, wan t die komt niet zomaar in het midden van de andere file voor.

fileformat:
http://www.sonicspot.com/guide/wavefiles.html

en als je het niet zelf wilt uitvogelen dan doe je dat met de voorbeelden die je hebt gevonden, maar code van andere is in het begin wat moeilijkt te begrijpen.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Verwijderd

'alleen nu wordt ik hier niet echt veel wijs uit, ook niet na het lezen van het boek Aan de slag met C++."

Ik neem aan dat dit niet je eerste programmeer opdracht is?


http://www.dsprelated.com/showmessage/19299/1.php

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Janoz schreef op donderdag 24 november 2005 @ 14:31:
Ik hoop voor je dat je enkel op exact hetzelfde stukje geluid hoeft te zoeken. Een sample die daadwerkelijk uit het orgineel geknipt is. Anders gaat het behoorlijk lastig worden en zul je met FFT's ed aan de slag moeten gaan. NOFI, maar aangezien je standaard voorbeelden van het inlezen van een wav file al redelijk onbegrijpbaar vindt hoop ik dat het enkel om het eerste gaat, en dan nog zul je het met dergelijke/deze sites moeten doen.

Is dit de eerste keer dat je met C++ gaat werken? NOFI, maar in dat geval zou ik eens overwegen of je niet een andere opdracht kan doen.
C++ lijkt me het probleem niet. TS kan niet beschrijven wat hij wil, dus dan is de taal irrelevant. Het eerste wat je hier nodig hebt is een algoritme.

Ook een deelmatch is al lastig genoeg. Wat precies bedoel je? 1 gemeenschappelijke byte is triviaal. Exact dezelfde sequence is ook triviaal.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-04 02:19
MSalters schreef op donderdag 24 november 2005 @ 20:30:
Ook een deelmatch is al lastig genoeg. Wat precies bedoel je? 1 gemeenschappelijke byte is triviaal. Exact dezelfde sequence is ook triviaal.
Als je dat een beetje efficiënt wil doen is dat volgens mij lang niet zo triviaal als jij het hier voorstelt.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Soultaker schreef op donderdag 24 november 2005 @ 20:35:
Als je dat een beetje efficiënt wil doen is dat volgens mij lang niet zo triviaal als jij het hier voorstelt.
String matching is dat; niet geheel triviaal nee. Zie bv http://www-igm.univ-mlv.fr/~lecroq/string/node14.html en http://www.ics.uci.edu/~eppstein/161/960227.html .

Verwijderd

byte comparision lijkt me wat meer gepast, als je compare score maar hoog genoeg is kan je van een 'hit' uitgaan

maar zoals eerder al vermeld is zal je sample aan een aantal voorwaarden moeten voldoen die gelijk zijn aan het orgineel.

[ Voor 39% gewijzigd door Verwijderd op 24-11-2005 22:37 ]


  • Gurdie
  • Registratie: Maart 2005
  • Laatst online: 06-11-2025
Ik heb zelf al een programma geschreven die de code van 2 text files met elkaar vergelijkt, en dan indien nodig veranderingen kan plegen in 1 van de 2 text files.

Het probleem waar ik dus mee zit is: kan ik die .wav file net zo inlezen als een text file zodat ik de code van die .wav (sample file) kan uitlezen en kan gaan vergelijken met de andere .wav (complete file), en dan kan zeggen van dat de sample voorkomt of niet voorkomt.

er zit geen verschil in samplerate of bitdiepte in de 2 verschillende .wav files die ik gebruik, omdat ik gewoon een stukje uit die complete file gebruik voor het programma.

Het programma moet verder zo efficient mogelijk zijn, en hoeft niet met verschillende samplerates of verschillende soorten bitdieptes van .wav files te werken. En het is een opdracht voor school en hoeft dus niet in de praktijk alle files kunnen herkennen en vergelijken.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-04 02:19
Gurdie schreef op donderdag 24 november 2005 @ 23:01:
Het probleem waar ik dus mee zit is: kan ik die .wav file net zo inlezen als een text file zodat ik de code van die .wav (sample file) kan uitlezen en kan gaan vergelijken met de andere .wav (complete file), en dan kan zeggen van dat de sample voorkomt of niet voorkomt.
Dat is geen erg nauwkeurige probleemomschrijving. Hoe moeten wij weten hoe jij 'een text file inleest'? Zonder die informatie kunnen wij niet beoordelen of dat ook werkt voor je geluidsbestand. Sowieso lijkt me dit een 'probleem' dat je zo kan oplossen door het simpelweg te proberen.
Het programma moet verder zo efficient mogelijk zijn, en hoeft niet met verschillende samplerates of verschillende soorten bitdieptes van .wav files te werken. En het is een opdracht voor school en hoeft dus niet in de praktijk alle files kunnen herkennen en vergelijken.
Ik neem aan dat de school ook verwacht dat je het zelf oplost. Ik krijg niet het idee dat je er al mee bezig bent geweest, anders had je het probleem al tenminste kunnen opsplitsen in het inlezen van de samples van een audiobestand enerzijds (daarvoor moet je het bestandsformaat opzoeken) en het vinden van de ene string in de andere anderzijds (waarvoor Zoijar goede linkjes gaf).

Verwijderd

idd soultaker, voldoende advies is nu gegeven
www.google.com, als je echt technische vragen hebt kan je die hier natuurlijk gewoon stellen

voorkauwen doen we niet, je zult zelf nu dingen moeten onderzoeken -

tip: het belangrijkste nu is dat je het formaat goed kent/ begrijpt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Soultaker schreef op donderdag 24 november 2005 @ 20:35:
[...]

Als je dat een beetje efficiënt wil doen is dat volgens mij lang niet zo triviaal als jij het hier voorstelt.
Kom nou, de extremen zijn triviaal; Gelijke sequence betekent twee strings die even lang zijn en token-voor-token gelijk. Een gemeenschappelijke byte vinden is een kwestie van twee histogrammen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1