Kysymys:
Voinko käyttää FFT: tä tunnistaaksesi nuotit pianolla?
michaelsnowden
2016-08-07 23:34:32 UTC
view on stackexchange narkive permalink

Haluan luoda työkalun, joka tunnistaa muutaman nuotin (tiedän, että tämä on pyörän keksiminen uudelleen).Joten soitin keskellä C, D ja E pianolla, ja sen pitäisi pystyä luokittelemaan nuo nuotit.Näin pitäisi mielestäni lähestyä sitä:

  1. Nauhoita näyte siitä, että soitan nuottia
  2. Muunna signaali taajuusalueeksi nopealla Fourier-muunnoksella
  3. Etsi eniten esiintyvä taajuus (pohjimmiltaan taajuusalueen datan argmax)
  4. Oletetaan, että taajuus tulee soitetusta nuotista, ja luokittele se nuotin avulla

En ole vielä kokeillut mitään näistä, koska en halua aloittaa väärällä tiellä.Joten teoriassa toimiiko tämä?

Olisi mukavaa, jos voisit olla tarkempi otsikossa.Yritin sisällyttää vähän pianokorkeuden tunnistamiseen, mutta (ei-syntyperäinen) englantini epäonnistuu tänään.
@pipe ok muutin sen
"Näytteenne" soittamisesta pitäisi jo olla amplitudin ja ajan aaltomuoto.Pohjimmiltaan kohta 2 on tarpeeton.Suhteellisen yksinkertaiseksi toteutukseksi yllä olevien vaiheiden tulisi olla hienoja.
@user2943160 Lisäsin sen selkeäksi.Ääntä voidaan tallentaa monissa muodoissa, ja yleensä kestää jonkin verran sekoittamista saadakseen sen mukavaan amplitudiin ajan myötä.
@michaelsnowden: Käytät termiä "amplitudi" väärin: sinimuotoisen funktion amplitudi \ $ y (t) = A \ sin (\ omega t) \ $ on \ $ A \ $.Se on signaalin maksimimäärä (jännite, siirtymä, ...) ja se on vakio (tai muuttuu hitaasti taajuuden suhteen).Tarkoitat vain signaalia \ $ y (t) \ $.Muuten luulisin, että "ajan amplitudilla" tarkoitat signaalin kirjekuorta, mutta ymmärrän niin.
@Curd Hups olet oikeassa, se ei ole oikea sana.Vaihdan sen
@Curd Mitä sanaa käyttäisit?Teknisesti se on paine?
@michaelsnowden: kyllä, mutta sitten se muuttuu kalvon pituudeksi (siirtymäksi) ja mikrofoni muuntaa sen jännitteeksi (ja myöhemmin se digitalisoidaan ja sitä edustaa bittikombinaatio).Kutsun sitä vain (ääni) ** -signaaliksi **.
Haluaisin myös ehdottaa, että tarkastelet tätä vastaavaa kysymystä muutama viikko sitten, paljon hyvää tietoa tässä säikeessä http://physics.stackexchange.com/questions/268568/why-are-the-harmonics-pianotaajuuden-ei-kerrannaispohjan taajuuden
Tämä oli melkein täsmälleen viimeinen vuosi tietojenkäsittelytieteen tutkintoprojektini, paitsi kitaran soinnuilla, joten se on mahdollista
Se ei ole niin yksinkertaista kuin luulet.Pianon viritys on hienovaraista taidetta: https://fi.wikipedia.org/wiki/Enharmonisuus
Neljä vastused:
JRE
2016-08-07 23:52:18 UTC
view on stackexchange narkive permalink

Käsite on hyvä, mutta huomaat, että se ei ole käytännössä niin yksinkertaista.

Äänenvoimakkuus ei ole pelkästään hallitseva sävy, joten ongelma on 1.

FFT-taajuusalustat eivät voi lyödä kaikkia (tai edes useita) musiikillisen asteikon ääniä samanaikaisesti.

Ehdotan, että soitetaan ääniohjelmalla (esimerkiksi Audacity), joka sisältää FFT-analysaattorin ja äänigeneraattorin, jotta saat tuntuman siihen, mitä se voi (ja ei voi) tehdä ennen kuin yrität toteuttaa tiettyätehtävä FFT: n avulla.

Jos sinun on tunnistettava vain muutama tietty ääni, Goertzel-algoritmi voi olla helpompaa ja nopeampaa.

Kallistuksen tunnistus on monimutkaista, ja tällä alalla on vielä käynnissä tutkimusta.Sävyn tunnistus on melko suoraviivaista, mutta ei välttämättä tuo sinulle mitä haluat.

Jos aloitamme oletuksesta, että otokset ovat tietystä instrumentista, ongelma voi olla hieman helpompi käsitellä, eikö?
Tämä näyttää todella hyvältä.Yksi jatkokysymys on: voidaanko Goertzel-algoritmia käyttää kahden samanaikaisesti soitettavan nuotin havaitsemiseen?
Sitä voidaan käyttää samanaikaisten äänien havaitsemiseen.Onko tämä riittävä samanaikaisten muistiinpanojen havaitsemiseen, on erilainen kysymys, ja olen edelleen töissä.Minulla on Goertzel-pohjainen kitaranuotin, jonka kanssa olen ollut monta vuotta pois päältä ja päällä.
@mkeith: Lajittelu.Voit testata nuotteja ja katsoa, riittääkö hallitsevan sävyn havaitseminen tietylle instrumentille (ja ehkä vain kiinnostaville nuotteille). Sikäli kuin tiedän, ei kuitenkaan ole yleistä ratkaisua kaikkien nuottien havaitsemiseen kaikista instrumenteista.
steve_stackex
2016-08-08 13:35:20 UTC
view on stackexchange narkive permalink

Sanoisin, että signaalin multimodaalisen tarkkailuikkunan käyttö olisi parempi. Jotain audiosignaalin aallonpurkautumisen linjaa pitkin, jonka avulla voit tunnistaa nuotin sisällä olevat useat sävyt. Yup, itse asiassa Wavelets, sanoisin, että tie on oikea tapa edetä.

Tämä on hyvin yleinen erittely siitä, mitä aallot ovat, mutta ajattele niitä moniratkaisuikkunana, joka kulkee signaalin yli kuin STFT. Joten voit tunnistaa eri sinimuotoiset, joita esiintyy signaalin eri ajallisissa paikoissa. tämä on myös tärkeää, koska soittamasi nuotti ei ole kiinteä signaali, se soi ja hajoaa ajan myötä. En ole muusikko, mutta uskon, että sävyn dominointi muuttuu koko nuotin hajoamisen ajan.

tietysti aallonpurkautumisen jälkeen sinun on toteutettava algoritmeja, jotka tunnistavat nuotit ja oheisäänet.

Mielestäni aallot ratkaisevat todella ongelmat, joista ihmiset ovat puhuneet äänenvoimakkuuden tunnistamisen suhteen.

jos haluat oppia aaltojen toiminnasta, tämä on HP: n julkaisema upea valkopaperi siitä :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf ja Johdatus Waveletteihin

toteutusta varten MATLAB: lla on wavelet-työkalu, ja olen varma, että alustoille, kuten R jne., on olemassa lukuisia muita paketteja.

alephzero
2016-08-08 03:05:32 UTC
view on stackexchange narkive permalink

Oletan ajattelevasi nuotteja, jotka soitetaan pianon kantaman keskellä (esimerkiksi välillä 200–500 Hz), mutta jopa tällä alueella yhdellä nuotilla on monia sävyjä, jotka eivät ole tarkkoja kerrannaiset perustaajuudesta ja myös huomattava määrä laajakaistamelua jokaisen nuotin alussa ja ehkä myös lopussa.

Jos haluat äänekkäitä nuotteja nuotti-alueen alapäässä, huomaa, että hyvin vähän äänienergiasta (alle 1%) on itse asiassa nuotin peruskorkeudessa.

Toinen ongelma on, että FFT: n naiivi tulkinta olettaa, että yrität havaita signaalin vakio amplitudi. Tämä ei koske pianosäveleitä, joissa amplitudi seuraa tosiasiallisesti useita päällekkäisiä eksponentiaalisia hajoamisia - hajoamisen alkuosalla on suhteellisen lyhyt aikavakio, mutta myöhemmällä osalla on pidempi aikavakio.

Saatat olla parempi tutkia lyhytaikaisia ​​Fourier-muunnosmenetelmiä, esimerkiksi Gaborin muunnos tai wavelet-pohjaiset menetelmät.

Huomaa, että koska peräkkäisten nuottien perussävel nousee noin 6% jokaiselle nuotille, et tarvitsevat välttämättä erittäin suuren tarkkuuden tunnistaessaan äänen yliaaltojen taajuudet. Nuottien oikea tunnistaminen ei ole aivan sama ongelma kuin sen määrittäminen, ovatko nuotit tarkalleen sopusoinnussa musiikkiasteikon kanssa, jossa taajuuksia voidaan joutua mittaamaan paremmin kuin 0,1%: n tarkkuudella.

AbstractDissonance
2016-08-08 03:33:45 UTC
view on stackexchange narkive permalink

Kyllä, FFT on kyse tästä! Antaa sinulle syöttämiesi tietojen taajuusspektri. Vaikea osa on toteutuksen yksityiskohdat, kuten mainitsit.

Muuttaa vastausta tarkalleen mitä haluat tehdä.

Jos haluat vain analysoida omaa musiikkiasi , siellä on jo ohjelmistoja siihen. Voit tarkastella taajuuskorjaimia, jotka osoittavat vastauksen (pohjimmiltaan FFT), tai hankkia "musiikillinen taajuuskorjain", joka näyttää myös sävelkorkeudet. Voit saada ääntä midi VST -soittimiin, jotka muuntavat soittamasi sisällön oikeiksi midi-nuotteiksi. Jos näppäimistösi on midi, ohita vain VST: t ja tallenna midi suoraan.

Jos haluat opettaa itsellesi FFT: n ja miten se liittyy musiikkiin, hanki parempi jotain Matlabia, josta voit laskea tietojen FFT. Sillä on kyky tallentaa ja toistaa sekä lukea wav-tiedostoja ja vastaavia. Nämä ovat sitten todella helppoja käyttää. Voit piirtää äänen ja tehdä kaikenlaisia ​​analyysejä melko nopeasti, jos tiedät syntaksin.

Jos haluat rakentaa laitteen tekemään niin, se on melko monimutkaista. Tarvitset uC / dsp / fpga / etc-laskelmat. Suosituimmissa laitteissa on jo FFT-koodi, joten sinun ei tarvitse koodata sitä itse (myös monimutkainen).

Sinun on rakennettava piiri ja kaikki muu. Se ei ole vaikeaa, mutta kokemuksestasi / tiedostasi riippuen se voi viedä jonkin aikaa ja sillä on jyrkkä oppimiskäyrä. Se riippuu myös lopputuotteen laadusta.

Matemaattisesti ihanteellinen nuotti koostuu geometrisesta sarjasta "perus".

Oletetaan, että F0 on perustaajuus, silloin suurin osa nuotteista on likimääräisiä arvolla F (t). + F0 * summa (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 + ....

A_k: t ovat vain näiden korkeammien taajuuksien F_k vahvuus ja F_k on vain jokin F0: n kerrannaisista. Jos a_k = 0 kaikille k: lle, niin meillä on puhdas sinimuoto. Tämän sävelkorkeus on helppo havaita. Löydä vain FFT: n maksimimäärä, ja tämä taajuus on sävyn = nuotin perusta.

Kun otat FFT: n, päädyt siihen saatuihin tietoihin ja teet vain matematiikkaa. Se on periaatteessa laskenta.

Kaikki, mikä on suhteellisen helppoa.

Joitakin ongelmia, joita sinun on käsiteltävä. Huomaa, että kaikki nämä eivät ole "ratkaistu".

  1. Viive - jos aiot tehdä kaikenlaisia ​​reaaliaikaisia ​​juttuja, tästä voi tulla ongelma.

  2. Useita nuotteja - Nuottien ryhmää on vaikea määrittää kaikkien ylimääräisten yliaaltojen vuoksi. Jos toisto A = 440 Hz ja A '= 880 Hz, suurin osa yliaaltoista menee päällekkäin. Voit helposti saada A = 440 Hz, mutta A '= 880 Hz on hankalampi. Kun ajattelet sointuja, nopeita juoksuja jne., Kaikkien tietojen (muistiinpanojen) tarkka saaminen voi olla erittäin vaikeaa. Vaikka kaikki on yleensä matemaattisesti mahdollista, tiedoissa itsessään on virheitä ja poikkeamia, ja yhtälöt on määritelty joissakin tapauksissa.

  3. Melu - signaalin kohina voi antaa sinulle vääriä tuloksia . Jos esiintyy musiikillista melua, se voi heikentää tuloksia. Tällöin tarvitaan parempia algoritmeja = aika + raha + tieto.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...