Toon posts:

[C++] 8 bands equalizer voor geluid

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

Verwijderd

Topicstarter
Ik moet voor mijn stage onder andere een 8-bands equalizer maken om per band het geluidsniveau te kunnen aanpassen (zoals in winamp). Ik ben op zoek gegaan naar wat voorbeeldcode om deze equalizer te kunnen ontwerpen / implementeren. Probleem is alleen dat de goede voorbeelden commerciele of freeware software zijn, waarbij de sourcecode niet vrijgegeven wordt.
Ik ben inmiddels al een paar dagen aan het zoeken naar een goede aanpak om hem te ontwerpen / implementeren, maar kan niets relevants vinden (verdwaal een btje in de google returns).

Heeft een van jullie ervaring met het maken van een software-equalizer in C++ die mij op weg kan helpen zodat ik de equalizer kan gaan ontwerpen / implementeren?

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoek eens op Fourier Transforms en Fast Fourier Transforms (FFT)

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.


  • Martin Sturm
  • Registratie: December 1999
  • Laatst online: 13-08 12:34
In XMMS zit toch zo'n equalizer? is GPL dus opensource, misschien daar eens naar kijken. Er is verder nog ladingen andere open-source software die dergelijke eqs implementeren volgens mij.

Verwijderd

psies wat oisyin zegt - Fourier Transform eroverheen zodat je het geluidsspectrum krijgt. Daar kan je tenminste wat mee (oppompen of afzwakken op bepaalde banden bijvoorbeeld) :)

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

.oisyn

Moderator Devschuur®

Demotivational Speaker



lastig he, mijn nick :P

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

stop calling me Nick..

  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
op http://sourceforge.net/ zal je een hoop c++ audio apps kunnen vinden

  • AFR
  • Registratie: Juni 2001
  • Niet online

AFR

Fourier transforms zijn leuk om spectrum-plaatjes te maken, maar kosten waarschijnlijk veel rekentijd als je ze wilt gebruiken in een equalizer (zou immers betekenen tijddomein-> frequentiedomein -> aanpassingen -> terug naar tijddomein).

Misschien is het goed om eerst eens te kijken wat zo'n equalizer doet:
1) Ingandssignaal doorvoeren naar een stel standaard filters (1xlowpass, 6xbandpass, 1xhighpass)
2) De 8 deelsignalen vervormen met het gewenste filter (in een eenvoudige equalizer zal dit een per band instelbare constante gain zijn)
3) 8 deelsignalen optellen en naar audio-uitgang voeren.

Om alles snel te laten lopen kun je het beste gebruik maken van filters die zijn gedefinieerd in het zogenaamde z-domein. Hiemee kun je het huidige uitgangssignaal berekenen mbv alleen de huidige sample + enkele samples uit het verleden (en geen hele berg data zoals met fourier nodig zou zijn). Misschien is het goed om in de bieb eens op zoek te gaan naar een goed boek over regeltechniek of signaalverwerking (bv. Franklin, Powel and Workman "Digital control of ..."). De implementatie in C bestaat uit standaard berekeningen.

Verwijderd

Topicstarter
AFR schreef op 18 maart 2003 @ 22:48:
Fourier transforms zijn leuk om spectrum-plaatjes te maken, maar kosten waarschijnlijk veel rekentijd als je ze wilt gebruiken in een equalizer (zou immers betekenen tijddomein-> frequentiedomein -> aanpassingen -> terug naar tijddomein).

Misschien is het goed om eerst eens te kijken wat zo'n equalizer doet:
1) Ingandssignaal doorvoeren naar een stel standaard filters (1xlowpass, 6xbandpass, 1xhighpass)
2) De 8 deelsignalen vervormen met het gewenste filter (in een eenvoudige equalizer zal dit een per band instelbare constante gain zijn)
3) 8 deelsignalen optellen en naar audio-uitgang voeren.

Om alles snel te laten lopen kun je het beste gebruik maken van filters die zijn gedefinieerd in het zogenaamde z-domein. Hiemee kun je het huidige uitgangssignaal berekenen mbv alleen de huidige sample + enkele samples uit het verleden (en geen hele berg data zoals met fourier nodig zou zijn). Misschien is het goed om in de bieb eens op zoek te gaan naar een goed boek over regeltechniek of signaalverwerking (bv. Franklin, Powel and Workman "Digital control of ..."). De implementatie in C bestaat uit standaard berekeningen.
Kan het boek niet vinden in de bieb en ook andere boeken daarover hebben ze niet. Ben nog aan het googlen geweest, maar loop inmiddels behoorlijk vast in de methodes en terminologie (heb op school het vak wat hierover ging niet in mijn keuzepakket van mijn afstudeerrichting gehad.) Probleem zit hem vooral in de juiste zoekterm vinden, want als ik op filter en z-domain zoek krijg ik zo'n sh*tload aan info dat het moelijk uitzoeken is wat de info is die ik nodig heb.

Welke formules heb ik nodig en hoe maak ik die vertaalslag naar C-code?
Zijn er op inet ergens voorbeelden die daar meer duidelijkheid over geven, en zo ja waar?

Verwijderd

ik gebruik nu fft met 128 samples per keer, werkt prima, moet alleen nog uitvinden of directx compressed data geeft want ik kreeg een beetje vage waarden.

en bij fft ga je van tijdsdomein naar een z-domein... oftewel frequentie domein, is een beetje gelijk aan laplace, moet je daar eens naar zoeken.

  • MrDry
  • Registratie: December 2001
  • Laatst online: 21-08 16:48

MrDry

Desperados!

Misschien past dit niet helemaal in dit topic maar ik ben al een tijdje opzoek naar een equalizer voor VB. Iemand enig idee waar ik dit kan vinden?

Er is wel het een en ander te vinden op het net maar dat is allemaal 3rd Party. Ik zoek eigenlijk een open source of anders een freeware ocx of dll....

Quod licet lovi, non licet bovi


Verwijderd

ik ben er op dit moment een aan het maken in vb.net maar zit nog op wat punten vast, als ik hem goed werkend heb release ik de source...

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

Verwijderd schreef op 21 March 2003 @ 09:53:
ik ben er op dit moment een aan het maken in vb.net maar zit nog op wat punten vast, als ik hem goed werkend heb release ik de source...
Een equalizer proggen in VB.NET? VB is al ranzig, maar een real-time audiofilter in een virtual machine gebaseerd systeem implementeren is al helemaal erg 8)7

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

MrDry schreef op 21 March 2003 @ 09:47:
Misschien past dit niet helemaal in dit topic maar ik ben al een tijdje opzoek naar een equalizer voor VB. Iemand enig idee waar ik dit kan vinden?

Er is wel het een en ander te vinden op het net maar dat is allemaal 3rd Party. Ik zoek eigenlijk een open source of anders een freeware ocx of dll....


het past niet alleen in deze topic, maar het past niet eens op dit forum. Scriptrequests (in de trand van: "ik zoek dit en dit programma of script" zijn niet toegestaan op GoT

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.


  • AFR
  • Registratie: Juni 2001
  • Niet online

AFR

Verwijderd schreef op 21 March 2003 @ 09:43:
ik gebruik nu fft met 128 samples per keer, werkt prima, moet alleen nog uitvinden of directx compressed data geeft want ik kreeg een beetje vage waarden.

en bij fft ga je van tijdsdomein naar een z-domein... oftewel frequentie domein, is een beetje gelijk aan laplace, moet je daar eens naar zoeken.
Let op: Bij een fft ga je van het tijd-domein naar het s-domein (=frequentie-domein). Als je met signalen werkt kun je over het algemeen beter gebruik maken van het z-domein (=discreet domein). Voordeel hiervan is dat je veel minder data uit het verleden nodig hebt en de algorithmen eenvoudig zijn. Meestal in de vorm van:

y[k] = a1*y[k-1] + a2*y[k-2]... + b0*u[k] + b1*u[k-1]
Waarin k duidt op het nummer van de sample, y het uitgangssignaal is en u het ingangssignaal. Voor bandfilters heb je voldoende aan 2 waarden (!) uit het verleden. Moet nu mijn trein halen, maar kan later evt wel wat conversie tellen bezorgen. Indien je via je opleiding over MATLAB beschikt zou je eens naar het c2d() commando moeten kijken waarmee je bovenstaande formules af kunt leiden.

Verwijderd

Exirion ik lees alleen maar het db niveau uit en geef dit weer, gaat prima met dx 9, van het z-domein weet ik helemaal vrij weinig, heb vorig jaar wel iets met laplace gedaan op school. heb ook een edu versie van matlab op school. maar heb niet echt een idee hoe ik nu verder moet, ik heb al mijn array uit fourier, moet het alleen nog juist weergeven.

[ Voor 62% gewijzigd door Verwijderd op 21-03-2003 11:35 ]


Verwijderd

Topicstarter
AFR schreef op 21 March 2003 @ 11:25:
[...]


Let op: Bij een fft ga je van het tijd-domein naar het s-domein (=frequentie-domein). Als je met signalen werkt kun je over het algemeen beter gebruik maken van het z-domein (=discreet domein). Voordeel hiervan is dat je veel minder data uit het verleden nodig hebt en de algorithmen eenvoudig zijn. Meestal in de vorm van:

y[k] = a1*y[k-1] + a2*y[k-2]... + b0*u[k] + b1*u[k-1]
Waarin k duidt op het nummer van de sample, y het uitgangssignaal is en u het ingangssignaal. Voor bandfilters heb je voldoende aan 2 waarden (!) uit het verleden. Moet nu mijn trein halen, maar kan later evt wel wat conversie tellen bezorgen. Indien je via je opleiding over MATLAB beschikt zou je eens naar het c2d() commando moeten kijken waarmee je bovenstaande formules af kunt leiden.
Ik heb hier helaas geen MatLab :N. Dat zou het waarschijnlijk al een stuk eenvoudiger kunnen maken

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

djazete

steel

dit is denk ik een bruikbare link
http://shoko.calarts.edu/musicdsp/

al jaren een goeie maillist over DSP en audio in C++, dr is ook een code archive, daar zit ook wel een FFT class volgens mij
succes!

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

Verwijderd schreef op 21 March 2003 @ 11:26:
Exirion ik lees alleen maar het db niveau uit en geef dit weer, gaat prima met dx 9, van het z-domein weet ik helemaal vrij weinig, heb vorig jaar wel iets met laplace gedaan op school. heb ook een edu versie van matlab op school. maar heb niet echt een idee hoe ik nu verder moet, ik heb al mijn array uit fourier, moet het alleen nog juist weergeven.
Da's een spectrum analyzer en geen equalizer :)

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Exirion schreef op 21 March 2003 @ 10:02:
[...]

Een equalizer proggen in VB.NET? VB is al ranzig, maar een real-time audiofilter in een virtual machine gebaseerd systeem implementeren is al helemaal erg 8)7


ja maar jij dacht een jaar of 2 terug dat realtime raytracers ook niet te doen waren :+

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.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

.oisyn schreef op 21 March 2003 @ 12:26:
ja maar jij dacht een jaar of 2 terug dat realtime raytracers ook niet te doen waren :+
Dat is nogsteeds zo, als je het hebt over volwassen raytracers :) Gestripte raytracers zijn met wat trucjes prima te maken, zelfs op een destop PC, en bovendien zijn we qua snelheid al weer een aardig stukje verder dan 2 jaar geleden ;) Ik blijf volhouden dat de plaatjes die 10 jaar geleden al met POV-Ray mogelijk waren, nu nogsteeds niet real-time te genereren zijn. Het duurt nog wel ff voordat we zo ver zijn.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik ga de discussie niet opnieuw voeren, hier was de topic van destijds: Realtime Raytracing

je kan lang en breed discussieren over wat jij onder 'raytracing' vindt vallen, maar feit blijft dat als een beeld wordt opgebouwd door rays te tracen in een 3d omgeving het een raytracer is, ook al ondersteund het al die povray/maya/3dsmax features niet. Dat jij het daar niet mee eens bent moet je zelf weten ;)

(FYI: realtime raytracers, of 'gestript' zoals jij ze noemt, gaan echt way back, en dus niet alleen die 2 jaar... ga maar eens wat oude demoscene demo's downloaden :))

[ Voor 16% gewijzigd door .oisyn op 21-03-2003 12:36 ]

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.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

.oisyn schreef op 21 March 2003 @ 12:34:
Dat jij het daar niet mee eens bent moet je zelf weten ;)
Dank u _/-\o_ :+

Maar inderdaad, onder volwassen raytracing versta ik iets wat minstens even goed/geavanceerd is als de trucjes die 3D videokaarten presteren. Als je dergelijke afbeeldingen, of nog een stuk beter omdat raytracing veel realistischer kan zijn dan dat, real-time kunt bereiken dan wordt het pas interessant. Dat duurt nog even.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 20-01 22:02

Yoozer

minimoog

Eh.. Exirion.
Kijk hier eens.

http://www.thebitboys.de/index/freeware/cat/sonstiges > en dan Heaven7. Is zo realtime als 't maar kan, is raytracing, en is maar 64k groot :).

teveel zooi, te weinig tijd


  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

O neeeee, Exirion denkt er weer iets vanaf te weten :+ Ik stel voor dat je dat oude topic eerst even naleest voordat je weer allemaal overbodige vergelijkingen tussen verschillende rendertechnieken gaat maken :)

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

Yoozer schreef op 21 March 2003 @ 12:51:
Eh.. Exirion.
Kijk hier eens.

http://www.thebitboys.de/index/freeware/cat/sonstiges > en dan Heaven7. Is zo realtime als 't maar kan, is raytracing, en is maar 64k groot :).
Dank je, die ken ik al ;)
toraq schreef op 21 March 2003 @ 12:53:
O neeeee, Exirion denkt er weer iets vanaf te weten :+ Ik stel voor dat je dat oude topic eerst even naleest voordat je weer allemaal overbodige vergelijkingen tussen verschillende rendertechnieken gaat maken :)
Als jij het overbodige vergelijkingen blijft noemen dan moet je toch even beter lezen om m'n punt te begrijpen. Ik weet heel goed waar ik het over heb, want ik was al met raycasting en raytracing bezig op een 286 toen jij misshien nog je luiers lag vol te schijten :P OK, beetje overdreven omdat we niet zo dramatisch veel in leeftijd schelen, maar je snapt me wel.

Als je na het lezen van m'n post in deze topic nogsteeds niet snapt waarom ik zo moeilijk doe over de waarde van real-time raytracing zoals die momenteel mogelijk is, dan heb je een plaat voor je hoofd :)

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


Verwijderd

buzz is een open source muziek programma. mischien dat er op hun developper's page iets nuttigs staat.

http://www.buzzmachines.com/ of preciezer
http://web.hibo.no/~mva/devlinks.php

  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Exirion: Ik weet niet waar jij hebt leren discussieren, maar misschien had je dat ook even moeten leren toen ik mijn luiers nog vol lag te schijten. Je kraamt onzin uit en je onderbouwt het door anderen persoonlijk aan te vallen.
Ken jij mij persoonlijk? Nee? O, goh, knap dat je dan toch weet hoe lang ik me al met dergelijke dingen bezighoud. Paranormaal of kraamt je onzin uit? Hmmmm...
Hoe lang je ergens mee bezig bent is niet de enige factor die bepaalt hoe goed je ergens in bent. Leuk voor je dat je er nu al jaren mee bezig bent, alleen wel jammer dat je er nog steeds geen zak vanaf weet :P
Zoek het woord zelfreflectie eens op, jij bent namelijk degene met een bord voor zijn kop.
Verder voor meer uitleg over overbodige vergelijkingen, kijk eens in dat vorige topic, daar heeft .oisyn nog geprobeerd jou het verschil uit te leggen. Helaas liep dat stuk op dat bord wat je voor je kop hebt :)
Jammer dat je de tijd tussen de twee topics niet hebt gebruikt om er meer over te leren.

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

toraq schreef op 21 March 2003 @ 17:19:
jammer dat je er nog steeds geen zak vanaf weet :P
Ja, dat blijf jij maar zeggen met je kortzichtige gebral. Dat je nogsteeds niet snapt dat ik een punt wil maken is jouw gebrek. Als je me beter zou kennen dan weet je dat ik goed ben in de dingen die ik me eigen wil maken, en dat geldt ook voor Raytracing.

Verder wil ik deze discussie staken aangezien een aantal koppige lamzakken mijn mening hardnekkig blijven verdraaien en als 'dom' bestempelen terwijl ze niet eens inzien waarom ik zo'n mening verkondig. Sja, kenmerkend voor de sfeer op GoT zal ik maar zeggen :) Ik groet u.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Oooo, nu ben ik kortzichtig. Ik snap best dat jij een punt wilt maken, ik vind alleen dat jouw punt nergens op slaat. Dat jij denkt dat je heel goed bent is jouw probleem - niet het mijne, dus houd dat maar lekker voor je. Als jij denkt dat jouw mening zo verheven is boven mijn 'kortzichtige gebral' nodig ik je van harte uit je mening nader uit te leggen en mij te overtuigen waarom jij gelijk hebt. Maar, ik accepteer alleen argumenten, geen autoritair gewauwel over hoeveel jaren je er al me bezig bent.
Ik vind jouw stijl van discussieren waardeloos, je hebt echt een jij-bent-het-niet-met-mij-eens-dus-je-bent-dom-houding.

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • AFR
  • Registratie: Juni 2001
  • Niet online

AFR

Zo... mijn vorige post moest ik afbreken om te voorkomen dat ik de trein zou missen.

Heb zojuist nog even gekeken hoe moeilijk het nu is om zo’n equalizer te maken. Indien je beschikt over een CACSD pakket en wat kennis over filters is het kinderspel. Zonder CACSD loop je gedeeltelijk vast omdat één van de parameters (K) erg moeilijk met de hand te berekenen is.

Voorbeeld: filter om de frequenties tussen omega1 en omega2 rad/s te filteren:
In s-domein: Gs(s) = om2*s / ((s+om1)(s+om2))
Omzetten naar z-domein met samplefrequentie Fs:
Gz(z) = (b0*z + b1) / (a0*z^2 + a1*z +a2)
Waarin:
b0 = K *om2*(exp(-om1./Fs)-exp(-om2./Fs)) (zie opmerking)
b1 = -b0
a0 = 1
a1 = -exp(-om1/Fs) -exp(-om2/Fs)
a2 = exp(-om1/Fs)*exp(-om2/Fs)

Gz(z) is een overdrachtsfuntie en beschrijft dus het verband tussen inganggsignaal U(z) en uitgang Y(z). Uitschrijven:

Gz(z) = Y(z)/U(z) = (b0*z + b1) / (a0*z^2 + a1*z +a2)
(a0*z^2 + a1*z +a2)Y(z) = (b0*z + b1)U(z)
(a0*z^2)Y(z) = (b0*z + b1)U(z) – (a1*z +a2)Y(z)

Elke vermenigvuldiging met z in het z-domein betekent een extra vertraging van één sampletijd.Ofwel in programmeertaal:
z*x[i] = x[i+1]

(a0*z^2)Y(z) = (b0*z + b1)U(z) – (a1*z +a2)Y(z)
a0*y[i+2] = b0*u[i+1]+b1*u[i]-a1*y[i+1]-a2*y[i]
Schuiven:
a0*y[i] = b0*u[i-1]+b1*u[i-2]-a1*y[i-1]-a2*y[i-2]

Je hebt nu een eenvoudige formule om een gefilterd geluidssignaal te krijgen tussen om1 en om2 op basis van enkele waarden uit het verleden:
y[i] = (b0*u[i-1]+b1*u[i-2]-a1*y[i-1]-a2*y[i-2]) / a0
In een equalizer zul je zo een aantal frequentiebanden filteren, versterken met een eigen factor en tenslotte weer bij elkaar optellen. Dit soort berekeningen kost zo weinig flops dat het best realtime in VB kan (tenzij je een PC uit de oertijd gebruikt).

Parameter K in bovenstaande formules is lastig met de hand te berekenen, maar als je aangeeft voor welke banden je deze factor nodig hebt kan iemand je wellicht de factor bezorgen. Is slechts één commando in MATLAB (of een willekeurig ander CACSD pakket). Misschien een leuke taak voor onze KEMPHANEN zodat ze ook wat PRODUKTIEFS BIJ KUNNEN DRAGEN aan dit topic.

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 21:04

Exirion

Gadgetfetisjist

toraq schreef op 22 March 2003 @ 02:57:
Maar, ik accepteer alleen argumenten, geen autoritair gewauwel over hoeveel jaren je er al me bezig bent.
Ik vind jouw stijl van discussieren waardeloos, je hebt echt een jij-bent-het-niet-met-mij-eens-dus-je-bent-dom-houding.
Ik heb nu en in het verleden geen enkele onwaarheid over Raytracing verkondigd, dus als jij doodleukt beweert dat ik er nogsteeds geen zak vanaf weet dan lok je dit soort reacties uit. Da's ook een fijne manier van discussies voeren, helemaal als je iemand die een punt wil maken willens en wetens blijft afbekken door argumenten te verdaaien. Kortom, kijk ook eens naar je eigen invloed op een discussie. Je zou mensen met een visie die afwijkt van het gebruikelijke eens kunnen proberen te begrijpen. I rest my case, de groeten.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein

Pagina: 1