[c++] benaderen geluidskaart

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

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Hallo,

Wij hebben voor school de opdracht gekregen (projectmatig) om met de line-in of de gameport van de geluidskaart een spanning te meten. hiervoor moeten wij een programma maken in c++ en daarvoor dus ook uitvinden hoe je de gameport/ line in van de geluidskaart benaderd en hiermee gegevens inleest.

Dit laatste is het probleem. ik kan nergens vinden hoe dat moet?
heeft iemand een idee waar ik moet zoeken?
of kan iemand mij misschien vertellen hoe dat moet?
of weet iemand misschien ergens een goede uitleg te staan?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

platform?

het kan namelijk niet met puur C++, daar moet je platform-specifieke functies voor gebruiken

[ Voor 4% gewijzigd door .oisyn op 15-04-2003 14:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
platform Windows (NT4.0)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

heb je al eens in de MSDN gezocht naar multimedia functies?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
heb wel iets gezien van directSound. Maar daar snap ik niet zoveel van en weet ik ook niet hoe ik die kan gebruiken. tevens ik vraag mij ook af of ik daarmee een ingelezen signaal kan analyseren. (amplitude en freq).

  • irondog
  • Registratie: Januari 2001
  • Laatst online: 11-05-2025

irondog

alle dingen moeten onzin zijn

Portaudio voor alle platformen.

http://www.portaudio.com/
Heb vorig trimester een automatische dj geprogrammeerd op school.

[P5B deluxe] [Core2Duo 6300] [2 X 1GB DDR2] [GF FX7300] [320 GB WD] [Gentoo] [VISTA]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

DirectSound is veel te hoog gegrepen. Zoek eens bij waveInOpen, waveOutOpen en gerelateerde functies, dan ben je klaar.

Professionele website nodig?


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Als je echt signalen moet meten moet je trouwens de line in nemen.
De gameport is alleen geschikt voor spanningen of desnoods signalen met frequenties als 1Hz.
Hoe dit in windows werkt allemaal weet ik niet, maar in dos kan je zelf een i/o port uitlezen/schrijven voor die gameport.
Dit doe je voor zover ik uit mijn hoofd weet door een waarde te schrijven naar die port, en vervolgens de port te lezen tot een bepaalt bitje 0 wordt.
De tijd dat het kost voor dat bitje om 0 te worden is afhankelijk van de spanning.
Deze tijd is trouwens ook erg afhankelijk van je cpu en ik denk verder ook de chipset en andere zooi in je systeem, daarom moeten analoge joysticks dus ook gecalibreert worden voor je computer.
Conclusie, frequenties analeseren of alleen de spanning meten, ik zou voor de line in gaan.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • avon
  • Registratie: November 2002
  • Laatst online: 27-06-2025
hier liep laatst nog een topic over!

Gratis webwinkel beginnen? Met Onetoshop.com kunt u direct beginnen!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

AvOn schreef op 15 april 2003 @ 16:40:
hier liep laatst nog een topic over!
kom dan op z'n minst met een linkje ipv met de korte mededeling dat hier onlangs nog een topic over was

Anyway, het lijkt me vrij simpel, kijk gewoon eens naar de waveIn* functies, zoals Curry al zei, en dan is het gewoon een kwestie van data uitlezen. Je hoeft er verder niets mee te doen, omzetten naar digitale signalen doet de A/C converter op je geluidskaart al

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020

djazete

steel

portaudio is/wordt trouwens 'geport' naar C++..

Verwijderd

Ik zoek dus een manier om geluid te kunnen "detecteren" dat via de mic binnenkomt. Ik wil hiermee een bitmapje 2 seconden laten verschijnen. Maar hoe kan ik het beste het geluid detecteren op de geluidskaart dat boven een bepaald niveau komt?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 15 april 2003 @ 20:24:
Ik zoek dus een manier om geluid te kunnen "detecteren" dat via de mic binnenkomt. Ik wil hiermee een bitmapje 2 seconden laten verschijnen. Maar hoe kan ik het beste het geluid detecteren op de geluidskaart dat boven een bepaald niveau komt?
kzallutnogeenkeerzegguh: waveInOpen.

Professionele website nodig?


Verwijderd

Nou, ik heb mij dus echt lam gezocht op waveInOpen, ben een paar voorbeeldjes tegengekomen voor Delphi.... maar dat zijn allemaal normale opname programma's. Ik wil graag gewoon "realtime" kunnen kijken of er signaal binnenkomt op de geluidskaart of niet.
Met waveInOpen moet je eerst alles in een buffer plaatsen.... misschien kan dit anders?

Zo moeilijk moet dit toch niet zijn? of wel misschien :) ?

Verwijderd

http://msdn.microsoft.com.../multimed/mmfunc_1q5q.asp

Welke compiler ga je gebruiken eigenlijk ? (Gewoon nieuwsgierig)

[ Voor 8% gewijzigd door Verwijderd op 16-04-2003 08:59 ]


Verwijderd

Ik gebruik gewoon de compiler van C++ Builder 5....

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 16 April 2003 @ 08:52:
Nou, ik heb mij dus echt lam gezocht op waveInOpen, ben een paar voorbeeldjes tegengekomen voor Delphi.... maar dat zijn allemaal normale opname programma's. Ik wil graag gewoon "realtime" kunnen kijken of er signaal binnenkomt op de geluidskaart of niet.
Met waveInOpen moet je eerst alles in een buffer plaatsen.... misschien kan dit anders?
wat is daar het probleem van? Momentopname van een geluid is niet zinnig, aan 1 enkele sample heb je niets. Dat jij dat nu wel wilt hebben omdat je de geluidskaart ergens voor gebruikt waarvoor ie niet is gemaakt is natuurlijk je eigen probleem ;)
Maar ik zie nog steeds het vervelende van een buffer niet. In plaats van 1 sample heb je een rijtje samples, niets mis mee toch?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Je kan de line-in van een geluidskaart niet gebruiken om DC (gelijkstroom) spanningen mee te meten; hij werkt alleen in een bepaald frequentiebereik (zo'n 20 tot 20000 Hz als je geluk hebt). Gelijkstroomcomponenten worden uit het geluid gefilterd zodat bij een verschil in nul-niveau er niet van alles wordt opgeblazen...

Verwijderd

Ik wil ook helemaal geen spanningen meten :)

Het moet een programma zijn dat een bitmapje laat zien wanneer er te veel lawaai in de kamer is.... niets meer en niets minder :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je dat wilt weten heb je al helemaal een buffer nodig, omdat je dan een analyse moet doen op verschillende samples

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Verwijderd schreef op 16 April 2003 @ 11:52:
Ik wil ook helemaal geen spanningen meten :)

Het moet een programma zijn dat een bitmapje laat zien wanneer er te veel lawaai in de kamer is.... niets meer en niets minder :)
Jij niet, de topicstarter wel :)

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Ik heb onder dos nog weleens een programma geschreven die in 320x200 een gold beweging liet zien van het geluid wat van de kaart naar de speakers ging.
Als je echt niet in dos kan werken en onder windows moet en geen buffers wilt gebruiken maar echt enkele samples dan zou je denk ik de i/o porten van die kaart zelf moeten aanspreken.
Alleen weet ik niet of dat wel mag van nt, daarom kan je denk ik beter samples van 1ms opnemen dan en die bekijken.
Hoe je 'herry' kan detecteren is niet moeilijk
geluidnivo += verschil(sample, vorigesample)
geluidnivo -= 1% of iets dergelijks.
Ik denk dat je dan al een aardig werkt iets hebt als je dit kan implementeren.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Verwijderd schreef op 16 April 2003 @ 11:52:
Ik wil ook helemaal geen spanningen meten :)

Het moet een programma zijn dat een bitmapje laat zien wanneer er te veel lawaai in de kamer is.... niets meer en niets minder :)
Ik heb daar nog wat code voor - je MOET wel een SB16 hebben een PC die minder snel gaat dan 200Mhz en Pascal :) (was geen bitmapje maar een gezichtje dat kwaad begon te kijken als het te luid werkt, maar als ie 'zachte' en hoge geluidjes hoorde beon ie te glimlachen.... )

wat is al dit ivm met buffers btw? natuurlijk ga je daar toch niet na elke sample iets mee doen? een sample rate van (jouw programmaatje) op 60Hz is al meer dan snel genoeg: 44000/60 kun je mooi een FFT op loslaten en een average voor je 'spanning'... Zowel waveIn/DirectSound zijn perfect goede oplossingen. RealTime bestaat niet op een PC , het lijkt alleen RealTime voor ons 'verstandje'. Trouwens betwijfel ik of spanning == volume...? ik denk dat je daar dus de absolute moet voor pakken alleen een nul-signaal is geen 'volume' dus zowel negatief/positief zijn 'spanningen' of niet ? :)

[ Voor 36% gewijzigd door hobbit_be op 16-04-2003 13:37 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Nou, ik heb mij dus echt lam gezocht op waveInOpen, ben een paar voorbeeldjes tegengekomen voor Delphi.... maar dat zijn allemaal normale opname programma's. Ik wil graag gewoon "realtime" kunnen kijken of er signaal binnenkomt op de geluidskaart of niet.
Met waveInOpen moet je eerst alles in een buffer plaatsen.... misschien kan dit anders?
Okee je trekt buffers van 0.5 seconde. Vervolgens bereken je het gemiddelde van alle samples in die buffer. Als die buffer > threshold toon je plaatje. How hard can it be?

Verdiep je eens wat in geluidsleer dan kom je er vanzelf achter dat je meerdere samples nodig hebt om geluidsniveau te bepalen.

Professionele website nodig?


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Ik heb wel een proggel in C++Builder 5 liggen dat wat geluid opneemt en weer kan afspelen. Zal 'm je vanavond ff mailen als ik het niet vergeet.

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 16 April 2003 @ 14:57:
[...]

Okee je trekt buffers van 0.5 seconde. Vervolgens bereken je het gemiddelde van alle samples in die buffer. Als die buffer > threshold toon je plaatje. How hard can it be?
dit klopt niet, bij een sinusgolf, maakt niet uit hoe hard, is het gemiddelde altijd 0. Wat je moet doen is uit de buffer de maximale en minimale waarden halen, en die van elkaar aftrekken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

WildernessChild schreef op 16 April 2003 @ 15:13:
Ik heb wel een proggel in C++Builder 5 liggen dat wat geluid opneemt en weer kan afspelen. Zal 'm je vanavond ff mailen als ik het niet vergeet.
Als je dat wilt doen :) heel erg graag...

mijn adres:
pahvelthui@student.han.nl

Alvast bedankt :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 16 April 2003 @ 16:27:
dit klopt niet, bij een sinusgolf, maakt niet uit hoe hard, is het gemiddelde altijd 0. Wat je moet doen is uit de buffer de maximale en minimale waarden halen, en die van elkaar aftrekken.
Excuus ik zat in een andere encoding te denken (MULAW geloof ik). Maar jouw methode klopt ook niet want standaard ruis kan best 2 extreme sampletjes veroorzaken in een overweldigende stilte. Het nut van die halve seconde buffer is juist dat je structurele herrie kunt herkennen ipv een klikje hier en daar. De correcte methode in klassiek wav-formaat is om het gemiddelde te nemen van de absolute waardes van alle samples, en dat te vergelijken met een threshold. Om die threshold te bepalen kun je het beste de running avg. realtime tonen en wat tests doen met muziek, klapperende deuren e.d.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Idd is mijn algoritme te gevoelig voor lullige klikjes, maar die kunnen er in principe met een low-pass filter uitgefilterd worden

Let wel dat het gemiddelde van de absolute samples ook niet altijd werkt, en dan met name in het geval dat het nul-punt eigenlijk niet het nulpunt is (je kunt bijvoorbeeld bij alle samples een waarde optellen, en dan veranderd het geluid niet. Mits je er even vanuit gaat dat hij niet overflowed natuurlijk ;). Maar dan veranderd de gemiddelde waarde wel.)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je kunt het echte gemiddelde nemen ter correctie (zoals je zelf al zei zal het in principe rond het nulpunt liggen). Het verschil tussen het reguliere gemiddelde en het absolute gemiddelde is een redelijk waterdichte methode om herrie te herkennen.

Maar wel overkill voor een 'geluidssensor'-achtig iets, als je alleen het verschil wil herkennen tussen herrie en geen herrie is al deze poespas niet nodig.

Professionele website nodig?


Verwijderd

Als je het signaal eerst even kwadrateert komt je gemiddelde niet op nul uit (detecteert wat beter :)). Je kunt na het middelen ook weer worteltrekken om niet op die hoge signaalniveaus uit te komen.

tadaaaah: RMS (root mean square), een bekende term voor audiofielen dacht ik...

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Stel je neemt een wav, die heeft samples van -32k tot +32k.
Je maakt een sinus met frequentie 1kHz en amplitude 1000.
Daarna een sinus met frequentie 10kHz en amplitude 200.
Volgens mij is dat die 2e sinus 2x harder dan die eerste omdat volgens mij het geluidsnivo frequentie x amplitude is.
Dus 1M voor de 1e en 2M voor de 2e.
Dus het gemiddelde van de absolute waarde van de samples is niet genoeg.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
is de spanning niet het oppervlak die de functie maakt (maw de intergraal)?

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Nee, spanning is echt de waarde van sample.
Als het afgespeeld wordt dan wordt namelijk de samples eenvoudig een voor een door een dac gestuurt, digitaal -> analoog converter.
En zo ook met opnemen door een adc, analoog -> digitaal converter.
De oppervlakte van de functie is meer het elektrisch vermogen.
De snelheid van verandering is het 'geluidvermogen' (dus hoe hard het klinkt).

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 16 April 2003 @ 17:16:
Als je het signaal eerst even kwadrateert komt je gemiddelde niet op nul uit (detecteert wat beter :)). Je kunt na het middelen ook weer worteltrekken om niet op die hoge signaalniveaus uit te komen.

tadaaaah: RMS (root mean square), een bekende term voor audiofielen dacht ik...
Dit is echter een 'dure' analyse in de vorm van CPU-cycli, en volgens mij compleet overkill voor het geven doel.

Als je muziek wil analyseren zodat je 2 mp3's op hetzelfde volume wil krijgen okee, maar om herrie te detecteren...? :?

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

hobbit_be schreef op 16 April 2003 @ 18:59:
is de spanning niet het oppervlak die de functie maakt (maw de intergraal)?
de oppervlakte van een volledige sinusgolf is juist 0 :) Dat is omdat de ene helft een positieve oppervlakte heeft, en de andere helft een gelijkwaardige negatieve oppervlakte
Wat je wilt weten is de amplitude, dus het verschil tussen het hoogste punt van de golf en het laagste punt van de golf

[ Voor 15% gewijzigd door .oisyn op 17-04-2003 10:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
.oisyn schreef op 17 April 2003 @ 10:12:
[...]
de oppervlakte van een volledige sinusgolf is juist 0 :) Dat is omdat de ene helft een positieve oppervlakte heeft, en de andere helft een gelijkwaardige negatieve oppervlakte
een negatieve oppervlakte? bestaat zoiets dan? nou je begrijpt wel wat ik bedoel toch: het oppervlak (absoluut dan maar, rond het nulpunt) ... ie dat is idd dan geen spanning maar een soort vermogen die nodig was voor het 'maken' van de curve... (ie een negatieve spanning is ook een inspanning dus, net als de amplitutde ook een 'negatieve' heeft Is hier nou echt totaal geen electric engineer die voor 100% duidelijk kan scheppen :) Want ik zou graag weten op welk voltage te souncard eigenlijk 'niets hoort' :) is dit 0.0v 2.5v 5.0v ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

hobbit_be schreef op 17 april 2003 @ 13:52:
[...]

een negatieve oppervlakte? bestaat zoiets dan?
wel in de wiskunde :)
als je de functie f(x) = -2 hebt, en je wilt het oppervlakte berekenen binnen het bereik [0, 2], dan is de oppervlakte: 2 * -2 = -4
Een negatieve oppervlakte dus (omdat het zich onder het 0-punt bevindt)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
rotte wiskunde ook :) al een geluk dat we in quadrant 1 van de cartesiaanse ruimte wonen want anders zou de immobilien sector ook maar aardig gek worden...
Pagina: 1