Räkna ut Group delay (matlabfråga)

Hur funkar tekniken bakom bra hifi?

Moderator: Redaktörer

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Räkna ut Group delay (matlabfråga)

Inläggav Naqref » 2004-12-11 20:43

Har lite problem att få det hela rätt vid en simulering. Ska räkna ut GD. Har en vektor med faskurvan (i radianer). Frekvenserna är givna för resp. värde på fasen. Hur får jag ut grupplöptiden så att det blir rätt? Verkar få in lite fel nämligen.

a=komplexa värdet på överföringsfunktionen
w=omega d v s 2*pi*f

angA=180/pi*unwrap(angle(a));
Ger fasgången för a i grader.

Deriverar grovt med:
derA=diff(angA);
derA=[derA(1) derA];
gdelayA=-derA./w;

Men detta blir en faktor 2 fel.

vad är fel?
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-11 22:23

Nu kan ju inte jag matlab, men var anger du frekvensavståndet mellan värdena i din array? Derivatan måste ju bero på hur tätt du har samplat (i frekvensled).
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-12 02:41

Jo det stämmer Svante. :) Men det är troligen inte där felet är eftersom jag har ett steg på 1Hz mellan samplingarna. Men jagser ju nu att koden bör göras om lite för att vara flexiblare för framtida bruk då jag inte kanske använder just 1Hz-steg.
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-12 12:58

OK, och du är 100% säker på att det verkligen är 1 Hz emellan samplingarna? Jag frågar eftersom jag ofta gör den grodan själv (tex när man får arrayen från en fft, det är lätt att missa en 2:a där) :D . Jag brukar kolla genom att ta en 100-Hz-ton och se om den hamnar i den 100:e positionen. Basics, men det verkar ju vara just ett sånt litet sk*tfel.
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-12 13:17

100% säker på att det är 1Hz i steg. Använder följande för att skapa frekvensvektorn nämligen:
f=1:500;

Det ger en vektor från 1 till 500 med steget ett. Ibland när jag vill köra lite snabbare så går jag dock över till logaritmiskt steg så jag får ändra koden lite ändå så det fungerar även då.

I vilket fall så verkar grupplöptiden bli en faktor två för stort och det känns inte bra att på måfå bara slänga in en konstant för att korrigera beräkningen. :?
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
Max_Headroom
Adventurer
 
Inlägg: 19253
Blev medlem: 2003-10-03
Ort: Metropolis, men passet är från Moskva

Inläggav Max_Headroom » 2004-12-12 17:06

Naqref skrev:I vilket fall så verkar grupplöptiden bli en faktor två för stort och det känns inte bra att på måfå bara slänga in en konstant för att korrigera beräkningen. :?


Du har tydligen glömt att räkna med Fingals konstant . :)
Denna signatur är endast för privat bruk. Vänligen läs ej!

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-12 23:13

Nu har jag ju inte alla detaljer i ditt problem, men en annan sak som ger en tvåa fel är om man försöker göra ett linjärt frekvenssvep genom att skriva sin(t/T* wmax*t), T är sluttiden, t är tiden och wmax är den tänkta vinkelfrekvensen vid t=T. Tanken skulle vara att när t=T så blir uttrycket sin(wmax*t) och vid t=0 så blir det sin(0). Det funkar inte, slutfrekvensen blir 2* wmax.

Johan Liljencrants sade en gång att det svåraste med akustiken det är att hålla reda på alla tvåor. Det verkar som om han har fått rätt ännu en gång. :wink:

Edit: kan du förklara vad raderna i ditt matlabprogram gör, så kanske även en matlabiot som jag kan förstå det?
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-13 11:48

Svante skrev:Edit: kan du förklara vad raderna i ditt matlabprogram gör, så kanske även en matlabiot som jag kan förstå det?


Oki! Tar med fler delar av programmet och gör koden röd.

f=1:500;
Denna skapar en vektor från värdet 1 till 500 med steget 1 och läggs i variabeln f. Dett är de diskreta frekvenser som ska användas vid uträkningen.

w=2.*pi.*f;
Skapar motsvarande vektor men med vinkelfrekvensen istället.

Vas=30;
Vbmin=44; %lådvolym
Fs=40;
Fb=27; %avstämningsfrekvens
Qes=0.68;
Qms=1.94;
Re=5.9;
Ql=10;
Rg=0.5;

Lägger in de variabler som ska användas.

Qes2=Qes/Re*(Re+Rg);
Räknar om Qes med hänsyn till generatorimpedansen (främst då resistansen hos en spole i delningsfiltret).

derF=diff(f);
diff tar skillnaden mellan värdena i vektorn f och skapar en ny vektor (derF) som innehåller ett element mindre.

[al,am,ap]=bssrflx3(f,Vas,Vb,Fs,Fb,Qms,Qes2,Ql);
Anropar funktionen bssrflx3 med indata i parantesen och utdata inom hakparantesen. Behöver inte gå in på alla detaljer men för varje värde på f så får man ett värde al som motsvarar ljudtrycket vid den frekvensen. al är en vektor med komplexa element.

angA=180/pi*unwrap(angle(al));
angle räknar ut vinkeln på varje element i al uttryckt i radianer. unwrap gör så att man kan få med fasvridningar större än +/-pi (d v s det gör om det till en kontinuerlig kurva). 180/pi omvandlar det hele till grader och allt läggs i angA.

derA=diff(angA);
Tar skillnaden mellan elementen i angA och lägger dem i derA p s s som för f en bit upp.

gdelayA=-derA./(w.*derF);
Är tänkt att räkna ut grupplöptiden men det blir inte rätt. Tar alltså skillnaderna i vinkel och delar dem med vinkelhastigheten och skillnaderna i frekvens.

Det är här det blir fel. Är säkert något helt trivialt som jag inte ser bara...
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-13 19:59

Naqref skrev:
Svante skrev:gdelayA=-derA./(w.*derF);


Blir det bara en faktor 2 fel, verkligen?

Jag har efter lite pillande fått för mig att grupplöptid definieras som d(fi)/d(omega). fi ska mätas i radianer (inte grader som du gör) så där har vi en faktor 180/pi fel. Om du utelämnar den faktorn så innehåller din array derA det som jag kallar d(fi). Din array DerF innehåller frekvensavståndet mellan elementen i derA, dvs om du multiplicerar det med 2 pi så får du det jag kallar för d(omega).

Min matlabkod, förmodligen med viss utländsk brytning, skulle se ut så här:

angA=unwrap(angle(al));
gdelayA=-derA./(2*pi*derF);

eller
f=1:500;
w=2.*pi.*f;
derw=diff(w);
angA=unwrap(angle(al));
gdelayA=-derA./(derw);

Vad alla punkterna betyder är ett mysterium för mig, men jag hoppas att nån sorts andemening går fram ändå.

Edit: Delningsfiltersimulering?
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-13 20:10

Har just fått höra att det finns en funktion som heter grpdelay i signaldelen av matlab.
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-13 20:59

Mjo... Det ska nog vara radianer har jag kommit på under dagen men då blir felet större... :?

grpdelay hjälpte inte här tyvärr (om jag förstår funktionen rätt) men det kan användas i andra sammanhang. :)

Punkterna (i ./ och .* ) berättar bara för matlab att det ska ske elementvis division resp multiplikation.

Och nej det är inte för delningsfilterkonstruktion. Då kan jag klara mig med att bara se fasvridningen på normalt sätt och se att de överlappar i delningsfilterområdet. Det hela är för simulering av baslådor så man kan hålla koll på att grupplöptiden håller sig under hörbarhetsgränsen. :)

Tackar för input! Får se om jag klurar ut det på egen hand.
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
zvenzzon
 
Inlägg: 989
Blev medlem: 2003-05-21
Ort: Linköping

Inläggav zvenzzon » 2004-12-13 21:49

Naqref skrev:Det hela är för simulering av baslådor så man kan hålla koll på att grupplöptiden håller sig under hörbarhetsgränsen.


snabb följdfråga: Var ungefär ligger hörbarhetegränsen? Hur låter det om man passerar gränsen?

mvh

Användarvisningsbild
Svante
Audiot!
 
Inlägg: 37552
Blev medlem: 2004-03-03
Ort: oakustisk

Inläggav Svante » 2004-12-13 22:10

Naqref skrev:Tackar för input! Får se om jag klurar ut det på egen hand.


Såg du att jag ville ha bort w i

gdelayA=-derA./(w.*derF);

och göra

gdelayA=-derA./(derw);

i stället?
Så länge har jag längat efter att loudness war skulle vara över. Nu börjar jag tro att vi faktiskt är där. Kruxet är att vi förlorade.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-14 12:04

Svante skrev:och göra

gdelayA=-derA./(derw);

i stället?


Missade det men noterade det när du påpekade det. :) Nu funkar det. Tack!

Bild på resultatet
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.

Användarvisningsbild
Naqref
Saknad grundare, †2014
 
Inlägg: 27893
Blev medlem: 2003-03-23
Ort: Krischansta

Inläggav Naqref » 2004-12-14 12:06

zvenzzon skrev:snabb följdfråga: Var ungefär ligger hörbarhetegränsen? Hur låter det om man passerar gränsen?


GD<=0.8/f

Exakt hur det yttrar sig hörselmässigt vet jag inte.
Audiodesigner åt en del. Larsen, Holographic Audio etc.
CEO och huvudägare i Acoustic Landscape R&D AB.
CTO / R&D Manager och delägare i Acoustic Illusion AB.


Återgå till Teknikforum


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 25 gäster