Förstår inte formel (Matte problem)
Förstår inte formel (Matte problem)
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.
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.
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.
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.
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.
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.
-
- EF Sponsor
- Inlägg: 924
- Blev medlem: 26 maj 2014, 12:54:35
- Ort: Karlskoga
Re: Förstår inte formel (Matte problem)
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?
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?
Re: Förstår inte formel (Matte problem)
Samplingshastigheten finns med i formlerna "fs"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.
Re: Förstår inte formel (Matte problem)
Kan du posta data för ett band, Centerfrekvens, brytfrekvens, förstärkning och samplingshastighet, samt vad programmet beräknar vid dessa värden.
Re: Förstår inte formel (Matte problem)
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?
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?
Re: Förstår inte formel (Matte problem)
Cutof freq, är väl rätt klart, bandbredden minus centerfrekvensen.
Man kan kanske välja själv hur stor den kan vara
Man kan kanske välja själv hur stor den kan vara
Re: Förstår inte formel (Matte problem)
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.
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.
Re: Förstår inte formel (Matte problem)
Intressant...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?
Jag provar med 6dB gain i verktyget.
Magiskt det blir rätt !!!
6db = 0x3FD9
Hur fan kom du på det
Djupt imponerad.
Re: Förstår inte formel (Matte problem)
Jag gör några stickprov med denna med.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.
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.
Re: Förstår inte formel (Matte problem)
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
Kan vara en ledtråd.Another common design parameter is the quality factor, Q. The Q of the filter is defined as Wo/BW (center frequency/bandwidth).
Re: Förstår inte formel (Matte problem)
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!
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')
Re: Förstår inte formel (Matte problem)
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.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
Re: Förstår inte formel (Matte problem)
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.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.
Re: Förstår inte formel (Matte problem)
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.
Bandbredden är per definition mellan -3dB punkterna. Du har alltid två punkter med -3 dB på en frekvenskurva, En övre och en nedre.
Re: Förstår inte formel (Matte problem)
Precis, och det var därför som jag också skrev "En klurig grej med equalisers är att bandbreddsbegreppet inte är självklart".Bandbredden är per definition mellan -3dB punkterna.
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å.
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.Då har du en oändlig bandbredd. (vilket iofs inte existerar)
Definitivt inte sant för de filter som denna tråden handlar om.Du har alltid två punkter med -3 dB på en frekvenskurva, En övre och en nedre.