Förstår inte formel (Matte problem)

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Förstår inte formel (Matte problem)

Inlägg av ToPNoTCH »

Jag fipplar lite med en audio codec och så här långt har allt funkat bra.
Chippet innehåller en parametrisk equlizer och för att ställa den måste man beräkna sex koefficienter.

Det finns ett PC program som man kan knappa in faktorerna Centre Frequency, Gain och Q, för att få ut koefficienterna.

Jag vill göra Frequency, Gain och Q ställbara och då kan man inte använda PC programmet (om man inte vill ha ett antal fasta värden) utan måste använda ett antal formler.
PC Programmet är dock bra att verifiera emot så man får till det.

Mitt problem är att det skiter sig redan på K-värdet (Tio upphöjt i 3dB/20dB) i min (antagligen förenklade värld) så blir det ett decimaltal, men inte enligt PC programmet.
Det måste antingen vara ett fundamentalt fel eller så fattar jag allt fel.

Målet är att få fram alla koefficienterna med hjälp av C-kod, men jag få få beräkningarna att bli rätt innan jag fixar det.
Namnlös1.jpg
Nedan är ett screenshoot ut PC programmet.
Det baseras på en Samplingsfrekvens på 44100 Hz

Ni ser reulterande koefficienter (I hexadecimala värden)
Jag kan inte begripa hur beskrivna formler kan leda fram till dessa värden.
Namnlös.jpg
Databladet är hyggligt "opedagogiskt" då man i beskrivningen använder begreppet "Bandwidth", Tabellen använder Q-värde (vilket är ett normalt begrepp i samband med parametriska EQ), och formeln pratar om cutoff (vilket inte nämns i texten).
Jag är helt fast, då det inte finns något om detta på nätet, mer än en ALSA Driver för LINUX, men jag ser inte beräknings formeln i den koden utan bara hur den läser in koefficienterna.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
kodar-holger
EF Sponsor
Inlägg: 916
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Förstår inte formel (Matte problem)

Inlägg av kodar-holger »

Ja, det måste finnas något mer. Det står ju dessutom i databladet att parametrarna är beroende av samplingshastigheten men formlerna har inte med det.
Så någonstans måste det finnas en formel för hur man konverterar parametrarna till registervärden.

Kan du fråga på Analog Devices utvecklarforum?

Om du provar med 2.9, 3.0 och 3.1 i gain, vad får du för värden då på K? Kanske vi kan lista ut kodningen?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förstår inte formel (Matte problem)

Inlägg av TomasL »

Ja, det måste finnas något mer. Det står ju dessutom i databladet att parametrarna är beroende av samplingshastigheten men formlerna har inte med det.
Samplingshastigheten finns med i formlerna "fs"
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förstår inte formel (Matte problem)

Inlägg av TomasL »

Kan du posta data för ett band, Centerfrekvens, brytfrekvens, förstärkning och samplingshastighet, samt vad programmet beräknar vid dessa värden.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Förstår inte formel (Matte problem)

Inlägg av guckrum »

Klurigt. Finns det ingen exempelkod att googla fram tro?

Parametern K verkar vara rättfram, om jag ser rätt.
Om Gain(dB)=2 så är ju K=10^(3/20)=1.412.
Och om vi skiftar det 13 steg (multiplicerar med 8192)
och klipper decimalerna får man 11571 som i
hexadecimal representation blir 0x2d33, vilket stämmer
med ditt screenshot.

Sedan blir det klurigare, jag hinner inte titta mer just
nu, men märker (som du också nämner) att man
kommer att behöva "Cutoff Freq". Vad är det?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förstår inte formel (Matte problem)

Inlägg av TomasL »

Cutof freq, är väl rätt klart, bandbredden minus centerfrekvensen.
Man kan kanske välja själv hur stor den kan vara
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Förstår inte formel (Matte problem)

Inlägg av guckrum »

Kunde inte slita mig:

K1 verkar vara K1 = 65536+k1*16384.

Exempel F=3000 (Fs=44100):

Omega0 = 2*pi*F/Fs = 0.427
-cos(Omega0) = -0.910
hex(65536+int(round(k1*16384)) = 0xc5c2

Stämmer för alla dina exempel, men det är omöjligt
att veta om det är rätt i allmänhet.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förstår inte formel (Matte problem)

Inlägg av ToPNoTCH »

guckrum skrev: 26 januari 2023, 08:54:31 Klurigt. Finns det ingen exempelkod att googla fram tro?

Parametern K verkar vara rättfram, om jag ser rätt.
Om Gain(dB)=2 så är ju K=10^(3/20)=1.412.
Och om vi skiftar det 13 steg (multiplicerar med 8192)
och klipper decimalerna får man 11571 som i
hexadecimal representation blir 0x2d33, vilket stämmer
med ditt screenshot.

Sedan blir det klurigare, jag hinner inte titta mer just
nu, men märker (som du också nämner) att man
kommer att behöva "Cutoff Freq". Vad är det?
Intressant...
Jag provar med 6dB gain i verktyget.

Magiskt det blir rätt !!!
6db = 0x3FD9

Hur fan kom du på det :humm:
Djupt imponerad.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förstår inte formel (Matte problem)

Inlägg av ToPNoTCH »

guckrum skrev: 26 januari 2023, 09:06:26 Kunde inte slita mig:

K1 verkar vara K1 = 65536+k1*16384.

Exempel F=3000 (Fs=44100):

Omega0 = 2*pi*F/Fs = 0.427
-cos(Omega0) = -0.910
hex(65536+int(round(k1*16384)) = 0xc5c2

Stämmer för alla dina exempel, men det är omöjligt
att veta om det är rätt i allmänhet.
Jag gör några stickprov med denna med.

:happy:

Provade med fyra slumpvisa F

Det verkar fan bli rätt med !!!
(kan slå på en siffra, beroende på avrundningen)

Stort tack...

Nu skall vi se om dom sista hänger ihop.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förstår inte formel (Matte problem)

Inlägg av ToPNoTCH »

guckrum skrev: 26 januari 2023, 08:54:31 Sedan blir det klurigare, jag hinner inte titta mer just
nu, men märker (som du också nämner) att man
kommer att behöva "Cutoff Freq". Vad är det?
Försökte bryta lite i förhållandet Q, Cutoff Freq och Bandwidth.
Hittade denna sida som generellt pratar om Parametrisk EQ LÄNK
I texten hittar jag
Another common design parameter is the quality factor, Q. The Q of the filter is defined as Wo/BW (center frequency/bandwidth).
Kan vara en ledtråd.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Förstår inte formel (Matte problem)

Inlägg av guckrum »

En klurig grej med equalisers är att bandbredds-
begreppet inte är självklart. Om man tex gör en
förstärkning runt en viss centerfrekvens på +1dB,
så finns det ju inga -3dB-punkter att beräkna
bandbredden runt! Det finns olika lösningar för
detta.

Jag vet inte hur de gjort i den här kretsen, och
det är dessutom oklart vad "cutf" har för värde
(kan du se det?), men om man sätter det till
2.229 så blir det ganska bra. Största felet för
dina exempel blir då drygt en promille.

Det vore kul att reda ut hur de gjort här, men
då behövs nog fler exempel.

Här är lite pythonkod som genererar värden för
dina exempel inom någon promille. Kan mycket
väl fallera för andra exempel!

Kod: Markera allt

from math import cos, tan, pi, sqrt

truth = {
    50:   (0x2d33, 0xc001, 0x3fb8, 0x0074, 0x05fa),
    150:  (0x2d33, 0xc004, 0x3f29, 0x015e, 0x0a50),
    400:  (0x2d33, 0xc01b, 0x3dcb, 0x03a5, 0x10a8),
    1000: (0x2d33, 0xc0a7, 0x3a9f, 0x0916, 0x19ad),
    3000: (0x2d33, 0xc5c2, 0x311e, 0x1a87, 0x2906),
}

Fs = 44100

def p(a, b, s):
    relerr = (int(a, 16) - b) / b
    print('  %-2s  %6s %6s   %s' % (s, a, hex(b), 'OK' if a==hex(b) else "% 7.5f" % (relerr,)))

for F in (50, 150, 400, 1000, 3000):
    G = 3
    # Q = 2
    K = 10**(G/20)
    w = 2.229  # MAGIC!
    BW = pi * (w * F - F) / Fs
    Omega0 = 2 * pi * F / Fs
    sK = sqrt(K)
    y = sK * tan(BW / 2)
    k1 = -cos(Omega0)
    k2 = (1 - y / sK) / (1 + y / sK)
    c1 = sqrt(1-k1*k1)
    c2 = sqrt(1-k2*k2)
    print('F =', F)
    a, b = hex(int(K*8192)), truth[F][0]
    p(a, b, 'K')
    a, b = hex(65536 + int(k1*16384)), truth[F][1]
    p(a, b, 'K1')
    a, b = hex(int(16384*k2)), truth[F][2]
    p(a, b, 'K2')
    a, b = hex(int(16384*c1)), truth[F][3]
    p(a, b, 'C1')
    a, b = hex(int(16384*c2)), truth[F][4]
    p(a, b, 'C2')
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förstår inte formel (Matte problem)

Inlägg av TomasL »

Om man tex gör en
förstärkning runt en viss centerfrekvens på +1dB,
så finns det ju inga -3dB-punkter att beräkna
Jo, det gör det väl, det är ju den frekvensen där utspänningen fallit 3dB, hur mycket förstärkning du har är ju ointressant.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Förstår inte formel (Matte problem)

Inlägg av guckrum »

Jo, det gör det väl, det är ju den frekvensen där utspänningen fallit 3dB, hur mycket förstärkning du har är ju ointressant.
Tänk en helt plan frekvenskurva med en liten bulle på mitten. Bullen är +1dB. Amplituden varierar mellan 0dB och +1dB. Det finns inga -3dB-punkter.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förstår inte formel (Matte problem)

Inlägg av TomasL »

Då har du en oändlig bandbredd. (vilket iofs inte existerar)
Bandbredden är per definition mellan -3dB punkterna. Du har alltid två punkter med -3 dB på en frekvenskurva, En övre och en nedre.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Förstår inte formel (Matte problem)

Inlägg av guckrum »

Bandbredden är per definition mellan -3dB punkterna.
Precis, och det var därför som jag också skrev "En klurig grej med equalisers är att bandbreddsbegreppet inte är självklart".
För någon som håller på med audio tror jag att det är helt rimligt att prata om att man höjer amplituden 1dB runt 1kHz, tex, och låter resten av frekvenserna vara oförändrade. Det där med "runt" antyder något som påminner om bandbredd, eftersom det man faktiskt vill göra är att höja amplituden i "1kHz-området". Då kan det kan vara relevant att kvantifiera hur "brett" detta område är. Men den klassiska definitionen funkar inte för det. På samma sätt får man problem med Q-värdet eftersom det baseras på bandbredden.

Det finns flera sätt att komma runt problemet. Ett är att säga att bandbredden är avståndet mellan de punkter där förstärkningen ökat till hälften. 0.5dB-punkterna i mitt exempel då.
Då har du en oändlig bandbredd. (vilket iofs inte existerar)
Ett digitalt filter har inte det problemet. Jag tycker inte att ett analogt filter för audio har det heller, om man kommer överens om vad en högsta audiofrekvens är.
Du har alltid två punkter med -3 dB på en frekvenskurva, En övre och en nedre.
Definitivt inte sant för de filter som denna tråden handlar om.
Skriv svar