Autor Zpráva
DarkMeni
Profil
Zdravím, chtěl bych si udělat aplikaci, která by uměla v audio soboru v zadaném okamžiku přečíst, že které by měly znít frekvence a jejich hlasitost, a potom podle toho zkusit rozpoznat, jestli zní nějakej tón. Ale nevim v jakým formátu se ukládá do audio souborů.
Je mi jasný že typ MP3 bude mít jinej formát než WAV, ale ani u jednoho ten formát neznám a nevim kde bych ho mohl zjistit (možná dekompilací nějakýho přehrávače, ale to mi přijde moc složitý)

Představuju si to asi tak, že bych program nechal číst bity v audio soboru bajt po bajtu, ale nejdřív musim zjistit, co že by to vlastně četl.
Kdy by vlastně četl tágy a kdy samotnej záznam, a v něm pak jestli zrovna čte frekvenci nebo její hlasitost nebo cokoliv jinýho

Jestli s tím má někdo nějaký zkušenosti nebo podobný program dělal, tak budu vděčný za každou radu
Juandev
Profil
Moc tomu nerozumím čeče! Formát souboru se zjistí například v dosu, TC, nebo přes vlastnosti ve Windows. Každý formát má pak jiné vlastnosti. Rozdíl mezi MP3 a WAVem je ale markantní. Ten první je kompresní, ten druhý nekompresní. Určitě tam bude nějaká datová vrstva, ale jestli zní nějaký tón se dovedu představit jen u MIDI. Pro čtení a interpretování dat týkajících se audio vrstvy potřebuješ pro každý formát jiný algoritmus.
weroro
Profil
Snažíš sa vyrobiť spektrálny analyzér? V akom jazyku? (možno práve ten názov si potreboval aby si vedel čo dať do googlu)
margin
Profil *
Juandev:
Rozdíl mezi MP3 a WAVem je ale markantní. Ten první je kompresní, ten druhý nekompresní.
Ne. WAV je kontejner a může obsahovat třebas i data třeba formátu MP3, i když naprostá většina WAvů obsahuje nekompromovaná lineárně kódovaná PCM data.
Amunak
Profil
Asi by bylo nejlepší zaměřit se jen na jeden formát, a když se ti to povede dopsat nějaký wrapper který by uměl dekódovat i složitější formáty. A typ souboru se dá často docela spolehlivě zjistit přečtením prvních několika bajtů souboru - formát tam bývá nějak vyznačený.
DarkMeni
Profil
weroro:
Jj, asi to bude ono - http://www.elektrorevue.cz/clanky/99011/index.html - něco takovýho, ze záznamu to rozloží zvuk na jednotlivý frekvence

A chci zjistit to, že když si třeba vymyslim, že nějaký formát by mohl vypadat takto:
//Informace o souboru, název, bitrate...
00010110 01010100 01010111 01010010 01010111
00010111 01000101 11010110 00011110 10010110
01010110 01010110 10010110 01010110 11000110
00000000 00000000 00000000 00000000 00000000 (oddělovač)
//Zvuk
//1. vzorek (čas: 1/44tisícina 1. vteřiny)
00110111 //1. (frekvence) lichý bajt vzorku
00001010 //2. (hlasitost) sudý bajt vzorku
01110010 //3. (frekvence) lichý bajt vzorku
00010010 //4. (hlasitost) sudý bajt vzorku
...
00000000 (oddělovač vzorků)
//2. vzorek (čas: 2/44tisícina 1. vteřiny)
00110111 (frekvence)
01011010 (hlasitost)
...
Tak pak vim kde sem, protože bych rozpoznal oddělovače (informace/zvuk => 5x NULL zasebou, mezi vzorky => jeden NULL)
Ale takle ty formáty asi nevypadaj, a rád bych nějak zjistil nějakej jeden formát - rači ten nejjednodušší (asi WAV)
Existuje nějaký popis algoritmu nějakého formátu? Jinak asi zbývá jen nějaký editor kterej umí otevřít soubor a zobrazit ho binárně a ne textově a pak si to zkusit nějak domyslet kde co je, podle toho jak by to vypadalo

Snad se mi teď podařilo dovysvětlit co že to vlastně chci
weroro
Profil
Pred časom som vytváral na zákazku jednu online aplikáciu, ktorá spracovávala WAV súbory (= spájala niekoľko samostatných zvukových stôp do jedného WAV, podobne ako v programoch na nahrávanie hudby). V tedy som použil tieto zdroje pre lepšie pochopenie daného formátu

https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/WAVE.html
DarkMeni
Profil
weroro:
Jj, to je to co sem hledal, díky!

Takže už vim kde hledat samply: o 4 bajty dál za řetězcem "data".
Ale pořád ještě nevim jak mam udělat graf [Hz]/[dB]
V tomto příkladě (https://ccrma.stanford.edu/courses/422/projects/WaveFormat/#example) má každý vzorek jen dvě 16bitové hodnoty (pro L a R, takže jen jednu pro L a jednu pro R) a do ní se moc informací asi nevejde (že by v tom vzorku byly popsaný všechny frekvence který mají znít a ke každý přiřazena její hlasitost to nevypadá), takže si myslim, že se ten graf řeší jinak, ale zatím jsem nepřišel na to, jak

Takže k "actual sound data (sample)" bych se už dostal, ale nevíš jak z nich dostanu ty frekvence?
Nebo spíš takto: Nevíš náhodou co ta hodnota ve vzorku znamená?
weroro
Profil
DarkMeni:
Ale pořád ještě nevim jak mam udělat graf [Hz]/[dB]
V tomto asi veľmi neporadím. V ActionScripte mám už hotovú funkciu computeSpectrum() objektu SoundMixer. Stále si ale nenapísal, v akom jazyku chceš danú aplikáciu robiť.


Tu sú aj zdrojové súbory podobnej aplikácie http://todaycreate.com/wp-content/creations/2007/02/BasicAudioSpectrumAnalyzer/
DarkMeni
Profil
Chci ji časem napsat v C++, ale ten se teprve učim a sem zatim jen u výpisu do konzole, takže nejdřív bych to zkusil v javascriptu (je mi jasný, že by to bylo pomalý, ale ten umim o něco víc než C++ a už bych v něm dokázal udělat i nějakej grafickej výstup do prohlížeče)
Teď mi došlo že ty sample data sou vlastně dekodovaný kodekem, a v tý ukázce byl použitej PCM, tak zkusim pohledat jestli se mi podaří najít jakým algoritmem ten kodek ty data dekoduje. A když ne, mohl by si mi dát ukázku tý funkce?
Jj, díky!
DarkMeni
Profil
Podařilo se mi najít zdrojový kód, který prej řeší to, o co se pokoušim, ale nedaří se mi to rozchodit - konkrétně v této části:
//Danielson-Lanzcos routine 
mmax=2;
//external loop
while(n > mmax){
    istep = mmax<<  1;
    theta=sinal*(2*pi/mmax);
    wtemp=sin(0.5*theta);
    wpr = -2.0*wtemp*wtemp;
    wpi=sin(theta);
    wr=1.0;
    wi=0.0;
    //internal loops
    for (m=1;m<mmax;m+=2){
        for (i= m;i<=n;i+=istep){
            j=i+mmax;
            tempr=wr*data[j-1]-wi*data[j];
            tempi=wr*data[j]+wi*data[j-1];
            data[j-1]=data[i-1]-tempr;
            data[j]=data[i]-tempi;
            data[i-1] += tempr;
            data[i] += tempi;
        }
        wr=(wtemp=wr)*wpr-wi*wpi+wr;
        wi=wi*wpr+wtemp*wpi+wi;
    }
    mmax=istep;
}
(http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm)

Nikde jsem nenašel co je to za konstantu (sinal), a proměnná to asi nebude - nikde dřív to jako proměnná není definovaný

Nevěděl by někdo jakou má mít "sinal" hodnotu?
Jan Tvrdík
Profil
DarkMeni:
proc si nestahnes cely zdrojak, co je k tomu clanku prilozen?
LudekBrno
Profil
DarkMeni:
Myslím, že je zde základní nepochopení způsobu digitálního záznamu zvuku. Tak jak si to představuješ ty, že v datové oblasti audiosouboru bude v postupné sekvenci zapsáno: "frekvence" a "hlasitost" atd. tak to spíše odpovídá zápisu syntetizovaného zvuku, rozhodně ne klasického audiozáznamu. Ten funguje úplně jinak. Pro jednoduchost, klasický wav má pouze jediný údaj "okamžitá amplituda" a ta sekvence se opakuje pravidelně v pevně dané rychlosti (tzv. vzorkování). Není tam nikde záznam o frekvenci, tu je potřeba odvodit z rychlosti změny amplitudy v poměru s rychlostí vzorkování. Obvyklejší formát mp3 to má ještě komplikované tím, že se jedná o komprimovaný záznam, takže je třeba nejprve dekomprimovat, abys získal zase tu původní sekvenci vzorků a mohl ji přehrát nebo analyzovat. Technicky podrobně netuším, jak to probíhá, jen jsem se pokusil trochu přiblížit princip.
DarkMeni
Profil
LudekBrno:
Jj, nejdřív sem si myslel že to pujde zjistit nějak jednoduše, ale pak mi došlo, že je to tak, jak říkáš
A nevíš teda jak můžu odvodit ty frekvence? Dělá se to prej nějak pomocí FFT, ale příklady na tu transformaci sem našel jen pro obraz a stejně sem to z toho moc nepobral
_es
Profil
DarkMeni:
příklady na tu transformaci sem našel jen pro obraz
FFT nie je pre obraz alebo pre zvuk či pre niečo konkrétnejšie, je to len iné vyjadrenie časového priebehu nejakej fyzikálnej veličiny.
DarkMeni
Profil
No to jo, ale dá se prej pomocí něj zjistit to spektrum
Jenže má (pro mě) složitej vzorec, kterej zrovna moc nechápu:

X(k) = sum(x(n)*e^-((2Pi*i/N)*n*k), n=0, N-1)

Vim že:
N - je počet vzorků
n - je časová oblast
k - je frekvenční oblast
A nevim co je e a i ani co si mam představit pod pojmem oblast (jestli to je jen hodnota, třeba 24000tý vzorek při vzorkování 48kHz, takže 1/2 první vteřiny, tak asi tak nějak bych to chápal)

WolframAlpha bere e jako konstantu a i jako imaginary unit, takže k e bych se možná nějak dostal (http://www.wolframalpha.com/input/?i=1e) a zbývá už asi jen zjistit jak vypočítám i a jak mam tu funkci pak použít aby sem z toho dostal to spektrum

Zase co sem koukal na algoritmus FFT přepsanej do Cečka, tak to tam bylo řešený jinak - tak by mě zajímalo, jestli na to du dobře nebo jestli mam hledat něco jinýho
juriad
Profil
DarkMeni:
Nechci tě podceňovat, ale vypadá to, že jsi středoškolskou matematiku přeskočil nebo se k ní ještě nedostal. To jak FFT funguje a proč funguje se učí až na vysokých školách.
Nezbude ti asi nic jiného, než si stáhnout nějakou hotovou knihovnu, která to už umí.
_es
Profil
DarkMeni:
nevim co je e a i
Viď cs.wikipedia.org/wiki/Eulerovo_%C4%8D%C3%ADslo a cs.wikipedia.org/wiki/Imagin%C3%A1rn%C3%AD_jednotka.
DarkMeni
Profil
_es:
A jo, wikipedie, díky :-D

juriad:
No zrovna sem u středoškolský matematiky, a s tím, že stažení knihovny bude jednodušší, máš pravdu, asi teda nějakou zkusim najít

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: