Diskuze - danyk.cz

Vlákno z kategorie: Hlavní diskuze
Celkem 23 odpovědí.


13.03.2017 (23:22:02) K # IP X
SOB's obalka :
nehrál ste si někdo někdy s integráčem MSGEQ7 ? Je to určený na takovej cikánskej spektrální analyzér, obsahuje 7 pásmovejch propustí, mezi kterejma přepíná a multiplexuje do jednoho analogovýho výstupu, já sem si objednal z ebaye 4 a funguje jenom jeden, druhej je hluchej na jednom kanálu, třetí je hluchej na jinym kanálu a čtvrtej je uplně v hajzlu, ten dává na výstupu furt stálou hodnotu, zrhuba polovinu napájecího napětí, máte s tim někdo ňáký zkušenosti ?
14.03.2017 (00:22:01)  # IP X
VroutekB:
Nemám, ale nejspíš si dostal nějaký zmrdky vyškubaný z recyklátu. Já takle si jednou namlel hubu na CPLD od Altery z Alíku. Pravda, sháněl jsem tenkrtá dost zastaralý atyp... Něco jak ty tvé MSGEQ7.
Si ten spektráč urob "po klasicku", neni to nic jinýho než hrst operáků ála pásmové propustě a peak detektory. Multiplexery taky nejsou problém. V SMD provedení na dvouvrstvě by to nemuselo být ani žádný extra peklo, byť to bude dost zpátečnický.**02
14.03.2017 (00:27:46)  # IP X
SOB's obalka :
Ja bych to radsi udelal tak, jak se to ma delat a sice pres FFT, ale nikde sem nenasel popis nebo vzorec kterymu bych rozumel a umel ho naflakat do arduina
14.03.2017 (01:13:34)  # IP X
RayeR (web) :
Ja se divim, ze se divite u tehle nakupu na Aliku a pod. za desetinove ceny co to stoji normalne... :)
14.03.2017 (12:04:41)  # IP X
Voitano obalka :
Já kupoval přes ebay od číňana historické Motoroly 68HC11F1, prý nové nepoužité. No fungovaly v zařízení špatně + už měly nahraný nějaký obsah v eeprom, takže prachy zpět. Už mám od nich strach kupovat, že natrefím na fejk a u výkonové součástky to člověk pozná až po úniku kouře, díky kterému ty součástky vlastně fungují **01
14.03.2017 (14:46:22)  # IP X
SOB's obalka :
No a mate nekdo nejakou literaturu nebo hotovej priklad na to FFT ? Na youtube je olno videi jak jim to maka na na arduinu, takze by to asi nemelo bejt tak slozity
14.03.2017 (21:30:33)  # IP X
VroutekB:
FFT máš popsaný všude možně na netu. Nebuď línej hledat. A s tím, že to někomu "maká" na ardujínu bych si tatk moc bejt tebou nefandil.
Krom toho, jestli ti jde o 7 hýbajících se bargrafů, tak tě mohu ujistit, že FFT rozhodně není ten správný způsob, jak na to. Biquad kaskáda bude mít určitě nižší výpočetní náročnost, než nějaké FFT, na které bys pak musel aplikovat správnou masku, aplikovat inverzní FFT (nezapomenout na použití vhodných oken) a pak detekovat amplitudu.
Hýbat každým bargrafem podle jediného vybraného frekvenčního "binu" FFT, umí sice každej vocas, ale ke správný implementaci spektráku to má daleko. Každý sloupec ti musí indikovat určitý pásmo (je to pásmová propust s nějakým Q), ne obsah konkrétního kmitočtu.
Navíc, na ten bargrafový spektrák tak jako tak potřebuješ log. frekvenci, takže bys to FFT musel počítat beztak s pěkně hovadským rozlišením, aby to na basech měřilo dobře, zatímco na vejškách už to to rozlišení bude tak leda k...

Jinak, česky popsaný FFT má na webu třeba Standa. Pokud se tím zvládneš prožrat a ještě to naprogramovat, budeš borec.
14.03.2017 (21:35:06)  # IP X
VroutekB:
14.03.2017 (21:41:02)  # IP X
VroutekB:
Pozn. bokem: áááá kurva totoo... Split radix algořiťmus **16
http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/codin...
14.03.2017 (21:56:35)  # IP X
SOB's obalka :
https://www.youtube.com/watch?v=I1kMYCH-UZ8&feature=you...
už sem to nějak rozmakal ale se třema, na levej kanál se používá ten jeden kterej je plně funkční, pavej kanál si bere všechny pásma krom 5. z druhýho integráče a ten 5. kanál si bere z toho třetího, kterýmu nefunguje poslední kanál, takže signály pro pravej kanál dávám dohromady ze dvou integráčů, doufám, že mi ten prodejce pošle nový.
No já bych právě chtěl víc pásem, nedalo by se pomocí tohohle integráče měřit víc pásem, třeba že by se přidal druhej, do kterýho by šel ten audiosignál směšovanej s nějakou frekvencí, aby se mu ty frekvence posunuly mezi frkvence toho prvního ?
14.03.2017 (22:26:59)  # IP X
VroutekB:
14.03.2017 (22:40:54)  # IP X
SOB's obalka :
a kurva, koukám že je od něj víc verzí, který maj jinak rozmístěný frekvence, takže by při použití dvou to šlo natáhnout ještě na víc pásem, jen koukám, že asi nebude žádná prdel ho sehnat
14.03.2017 (23:45:48)  # IP X
8-bit obalka (web) :
Můžeš zkusit kód co jsem napsal kdysi, jenom si změň floaty třeba na 16b inty (akorát nemám už tušení co by mělo být znaménkové): **02
/* n. iterace x0 ------+----+-(/2)------+-----+--(/2)- X0 \ / \ / / \ \ / x2 -(W0)+(-1)+--(/2)------+--X--+--(/2)- X1 \/ \/ /\ /\ x1 ------+----+-(/2)-(W0)-+(-1)-+--(/2)- X2 \ / / \ / \ / \ x3 -(W0)+(-1)+--(/2)-(W1)-+(-1)-+--(/2)- X3 1. a 2. iterace x0 -----+----+-------+-----+--(/2)- X0 \ / \ / / \ \ / x2 ----+(-1)+--------+--X--+--(/2)- X1 \/ \/ /\ /\ x1 -----+----+-------+(-1)-+--(/2)- X2 \ / / \ / \ / \ x3 ----+(-1)+--(-j)--+(-1)-+--(/2)- X3 */ void fft(float* x, BYTE ni, float* r, float* i) { DWORD b = 0; for(DWORD a = 0; a < (1 << ni); a++) // prehazet vstupni data do R { r[a] = x[b]; for(BYTE c = ni - 1; c != 0xFF; c--) // b je pocitadlo s obracenym poradim bitu { b = b ^ (1 << c); if((1 << c) & b) break; } } for(DWORD j = 0; j < (1 << ni); j = j + 4) // 1. a 2. iterace (W = 1 nebo 0, takze neni treba pouzivat tabulku) { float a = r[j]; float b = r[j + 1]; r[j] = (a + b + r[j + 2] + r[j + 3]) / 2; i[j] = 0; r[j+1] = (a - b) / 2; i[j+1] = (-r[j + 2] + r[j + 3]) /2; r[j+2] = (a + b - r[j + 2] - r[j + 3]) / 2; i[j+2] = 0; r[j+3] = r[j + 1]; i[j+3] = -i[j + 1]; } for(BYTE i = 3; i <= ni; i++) // n. iterace { for(DWORD j = 0; j < (1 << ni); j = j + (1 << i)) // pro kazdy "svazek" DFT2 { DWORD _i = 1 << (i - 1); for(DWORD k = 0; k < (1 << (i - 1)); k++) // pro kazde 2 DFT2 ve svazku { float _r = r[j + k]; float _i = i[j + k]; float _r2 = r[j + _i]; float _i2 = i[j + _i]; float _wr = cos[k * (1 << (ni - i)]; // predvypocitane sin/cos tabulky o velikosti 1 << ni float _wi = msin[k * (1 << (ni - i)]; r[j + k] = (_r + (_wr * _r2) - (_wi * _i2)) / 2; i[j + k] = (_i + (_wi * _r2) + (_wr * _i2)) / 2; r[j + _i] = (_r - (_wr * _r2) + (_wi * _i2)) / 2; i[j + _i] = (_i - (_wi * _r2) - (_wr * _i2)) / 2; _i ++; } } } }

Abys dostal amplitudu, musíš si to ještě přepočítat na polární souřadnice a taky osa frekvence co ti vyje je lineární, jak už psal Vroutek.
15.03.2017 (00:14:22)  # IP X
VroutekB:
Celý polární souřadnice nepotřebuje, stačí modul (odmocnina). Chraň bůh v tom AVRku mrdat ty arkustangenty **02
15.03.2017 (00:26:05)  # IP X
SOB's obalka :
To je asi zbytecny, tomu cos postnul vubec nerozumim, ani nevim jak to pouzit
15.03.2017 (00:57:21)  # IP X
8-bit obalka (web) :
Pardon, oprava - nějak jsem si neuvědomil že I tam už mám jak jsem měnil v původním kódu indexy které moc nedávaly smysl: **02
... for(BYTE iter = 3; iter <= ni; iter ++) { for(DWORD j = 0; j < (1 << ni); j = j + (1 << iter)) { DWORD _i = 1 << (iter - 1); for(DWORD k = 0; k < (1 << (iter - 1)); k++) { ... float _wr = cos[k * (1 << (ni - iter)]; float _wi = msin[k * (1 << (ni - iter)]; ...

Přiznám se, že už taky moc nevím jak to bylo myšleno, ale mělo by to fungovat. *X je pointer na pole vstupních hodnot v časové doméně, ze kterých fce vypočítá spektrum a uloží ho do polí R a I které si alokuješ předem. Délka každého je 1/2 délky X. Počet iterací ni je log2 počtu hodnot. Je to skoro hotové, jen si vypočítej v nějakém excelu tabulky cos a -sin a nezapomeň je v programu nacpat do flash paměti. A nakonec ještě potřebuješ z R a I udělat amplitudy, fáze už nejsou třeba jak správně poznamenal vroutek **02

for(WORD j = 0; j < 1 << (ni - 1); j ++) r[i] = odmocnina((DWORD)r[j]*r[j] + DWORD)i[j]*i[j]);

Funkce na odmocninu najdeš třeba na stránkách toho šíleného japonce:
16b: http://elm-chan.org/docs/avrlib/sqrt16.txt
32b: http://elm-chan.org/docs/avrlib/sqrt32.txt
15.03.2017 (00:59:31)  # IP X
8-bit obalka (web) :
Do kterého AVRka vlastně potřebuješ, aby se to vešlo?
15.03.2017 (01:22:53)  # IP X
SOB's obalka :
no já to potřebuju na arduino nano, tedy ATmega 328
A aby mi to teda fungovalo, tak si musim ještě udělat funkci která mi bude odebírat vzorky z analogovýho vstupu a bude je ukládat do toho pole vstupních hodnot ? Kolik vzorků má odebrat za vteřinu ?
15.03.2017 (01:40:28)  # IP X
8-bit obalka (web) :
Jo, potřebuješ ještě funkci co bude obšťastňovat A/D převodník a ukládat hodnoty do pole. Frekvenční doména vyjde v rozsahu od 0 do 1/2 vzorkovací frekvence, takže nastav vzorkovací frekvenci třeba na 40 KHz. Akorát jediný problém je, že ta sračka má na to strašně málo paměti. Všechno se totiž počítá lineárně abys to pak zobrazil logaritmicky. Takže aby výpočet vešel do paměti v 16b přesnosti, budeš se muset spokojit jenom se 128bodovým výsledkem (ze 256 naměřených vzorků). Takže 1. hodnota ve frekvenční doméně bude 20000/128 = 156,25 Hz a nebude to tím pádem moc reálně ukazovat basy. Možná asi fakt bude o hodně vhodnější použít pro každé pásmo jeden digitální filtr, ale s tím ti bohužel já neporadím.
15.03.2017 (01:50:44)  # IP X
SOB's obalka :
no tak já bych si to vyzkoušel aspoň takhle na tom co mam a pak až si třeba koupim arduino mega tak to rozjedu na tom, jen doufám, že zbyde v paměti místo i na obsluhu displaye, i když to s dá vyřešit tim, že to budu posílat druhýmu arduinu a to se teprv bude starat o display
15.03.2017 (02:12:29)  # IP X
8-bit obalka (web) :
Algoritmus potřebuje za podmínek co jsem popsal 1 kB SRAM (s dvojnásobným počtem vzorků by ti totiž nezbylo nic). ATmega1280 by mohla počítat z 1024 bodů a první bod FFT pak bude 39 Hz, což pořád není nic moc. Jo a ještě naměřené pole hodnot by asi chtělo napřed vynásobit nějakým woknem, můžeš použít třeba tu tabulku cos kterou potřebuješ pro výpočet FFT. Jenom ji posuň aby začátek a konec byl 0. Stejně ale asi nejlíp uděláš, když se podíváš na ty digitální filtry. Budou dávat lepší výsledky implementace potřebuje daleko míň prostředků.
15.03.2017 (02:34:26)  # IP X
8-bit obalka (web) :
Ještě jedna oprava- potřebuje to ve skutečnosti 1,5 kB SRAM, polovina výsledku se nakonec zahazuje. Jo a jinak ještě existuje nějaký míň rozežraný jakože-FFT algoritmus ze kterého rovnou leze amplituda, ale bohužel netuším jak se to jmenuje, natož počítá. Myslím že to tady někdo řešil.
15.03.2017 (13:27:24)  # IP X
VroutekB:
A není to náhoddou HFT (Hartley transform)? Nebo si to s něčím pletu?
15.03.2017 (14:53:05)  # IP X
8-bit obalka (web) :
Jj, to bude ono, našel jsem i popis a algoritmus od StandyM:
http://elektronika.kvalitne.cz/ATMEL/necoteorie/transfo...
Přezdívka:
Heslo:
Text: