FFT'yi bir piyanodaki notaları tanımak için kullanabilir miyim?


13

Birkaç nota tanıyan bir araç yaratmak istiyorum (bunun tekerleği yeniden icat ettiğini biliyorum). Bu yüzden orta C, D ve E'yi bir piyanoda çalarım ve bu notaları sınıflandırabilmeliydim. İşte yaklaşmam gerektiğini düşünüyorum:

  1. Not çalan bir örneğimi kaydet
  2. Hızlı fourier dönüşümünü kullanarak sinyali frekans alanına dönüştürün
  3. En çok bulunan frekansı bulun (temel olarak frekans alanı verilerinin argmax'ı)
  4. Sıklığın çalınan nota geldiğini varsayın ve nota sınıflandırmak için bunu kullanın

Bunlardan herhangi birini henüz denemedim çünkü yanlış yola başlamak istemiyorum. Peki, teorik olarak, bu işe yarayacak mı?


Başlıkta daha spesifik olsaydınız iyi olurdu. Piyano ses tanıma hakkında biraz dahil etmeye çalıştım, ancak (anadili olmayan) İngilizcem bugün beni başarısızlığa uğrattı.
boru

1
@pipe ok Değiştirdim
michaelsnowden

1
Bir nota çalmaya ilişkin "örneğiniz" zaten bir genlik ve zaman dalga formu olmalıdır. Esasen, 2. nokta gereksizdir. Nispeten basit bir uygulama için yukarıdaki adımlarınızın iyi olması gerekir.
user2943160

@ user2943160 Açık olması için ekledim. Ses birçok formatta saklanabilir ve zaman içinde güzel bir genliğe kavuşması genellikle biraz karışıklık gerektirir.
michaelsnowden

y(t)=Asin(ωt)Ay(t)

Yanıtlar:


23

Kavram iyidir, ancak pratikte o kadar basit olmadığını göreceksiniz.

Pitch sadece baskın ton değildir, bu nedenle 1 numaralı sorun vardır.

FFT frekans kutuları, müzik ölçeğinin tüm (veya birden fazla) tonlarını aynı anda vuramaz.

FFT kullanarak belirli bir görevi uygulamaya çalışmadan önce neler yapabileceğini (ve yapamayacağını) hissetmek için bir FFT analizörü ve ton üreteci içeren bir ses programı (örneğin Audacity) ile oynamayı öneririm.

Sadece birkaç belirli tonu tespit etmeniz gerekiyorsa, Goertzel algoritmasının daha kolay ve daha hızlı olduğunu görebilirsiniz.

Pitch tespiti karmaşıktır ve bu alanda hala araştırmalar devam etmektedir. Ton algılama oldukça basittir, ancak istediğinizi elde edemeyebilirsiniz.


Örneklerin belirli bir enstrümana ait olduğu varsayımıyla başlarsak, sorunla başa çıkmak biraz daha kolay olabilir, değil mi?
mkeith

Bu gerçekten iyi görünüyor. Takip eden bir soru şudur: Goertzel Algoritması, aynı anda çalınan iki notayı tespit etmek için kullanılabilir mi?
michaelsnowden

Eşzamanlı tonları tespit etmek için kullanılabilir. Bunun eşzamanlı notları tespit etmek için yeterli olup olmadığı farklı bir soru ve hala üzerinde çalıştığım bir soru. Goertzel tabanlı bir gitar notası dedektörüm var.
JRE

2
@mkeith: Bir çeşit. Notları test edebilir ve baskın tonu tespit etmenin belirli bir enstrüman için yeterli olup olmadığını (ve belki de sadece ilgili notları) görebilirsiniz. Bildiğim kadarıyla, tüm enstrümanlardan tüm notları tespit etmek için genel bir çözüm yoktur.
JRE

3

Sinyalin multimodal bir gözlem penceresi kullanmak daha iyi olurdu söyleyebilirim. Ses sinyalinizin dalgacık ayrışmasının çizgileri boyunca, notun içindeki çoklu tonları tanımlamanıza izin veren bir şey. Evet, aslında Wavelets, gideceğim yol olduğunu söyleyebilirim.

Bu, dalgacıkların ne olduğuna dair çok genel bir dökümdür, ancak bunları sinyallerinizi bir STFT gibi ileten bir çoklu çözüm penceresi olarak düşünün. Böylece sinyalinizdeki farklı zamansal konumlarda meydana gelen farklı sinüzoidalleri tanımlayabilirsiniz. bu, çaldığınız notanın sabit bir sinyal olmadığı, çaldığı ve daha sonra zamanla azaldığı için de önemlidir. Müzisyen değilim, ancak notanın çürümesi boyunca ton hakimiyetinin değiştiğine inanıyorum.

tabii ki dalgacık ayrışmasından sonra wou notaları ve çevresel tonları tanımlayan algoritmalar uygulamalıdır.

Bence dalgacıklar, zift tanımlama konusunda insanların konuştukları sorunları gerçekten ele alıyor.

dalgacıkların nasıl çalıştığını öğrenmek istiyorsanız, bu HP tarafından yayınlanan harika bir teknik incelemedir :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf ve Dalgacıklara Giriş

uygulama için, MATLAB'ın bir dalgacık aracı vardır ve eminim ki R, vb.


1

Sanırım piyano aralığının ortasında çalınan notaları düşünüyorsunuz (örneğin 200 ve 500 Hz arasında), ancak bu aralıkta bile, tek bir notanın temel frekansın tam katları olmayan birçok ton ve Her notanın başında ve belki de sonunda önemli miktarda geniş bant gürültüsü.

Nota aralığının alt ucundaki yüksek notalar için, ses enerjisinin çok azının (% 1'den az) aslında notanın temel adımında olduğunu göreceksiniz.

Başka bir sorun, bir FFT'nin saf bir yorumunun, tespit etmeye çalıştığınız sinyalin sabit genliğe sahip olduğunu varsaymasıdır. Bu, genliğin aslında üst üste bindirilmiş üstel çürümeleri izlediği piyano notaları için geçerli değildir - çürümenin ilk kısmı nispeten kısa bir zaman sabitine sahiptir, ancak sonraki kısım daha uzun bir zaman sabitine sahiptir.

Kısa zaman ölçeğinde Fourier dönüşüm yöntemlerini, örneğin Gabor dönüşümünü veya dalgacık tabanlı yöntemleri daha iyi inceleyebilirsiniz.

Ardışık notaların temel perdesi her nota için yaklaşık% 6 arttığından, sesdeki harmoniklerin frekanslarını tanımlamak için çok yüksek bir doğruluğa ihtiyacınız olmadığını unutmayın. Notaların doğru bir şekilde tanımlanması, notaların frekansların% 0,1'den daha iyi bir hassasiyetle ölçülmesi gerekebileceği bir müzikal skala ile doğru bir şekilde uyumlu olup olmadığını belirlemekle aynı sorun değildir.


0

Evet, FFT bununla ilgili! Beslediğiniz verilerin frekans spektrumunu vermek için. Zor kısmı, bahsettiğiniz gibi uygulama detaylarıdır.

Ne yapmak istediğinize bağlı olarak, cevabı tam olarak değiştirir.

Sadece kendi müziğinizi analiz etmek istiyorsanız, bunu yapmak için zaten yazılım var. Yanıtı gösteren EQ'lara (temelde FFT) bakabilir veya sahaları da gösteren bir "müzikal EQ" alabilirsiniz. Oynadıklarınızı doğru midi notalarına dönüştüren midi VST'lere ses alabilirsiniz. Klavyeniz midi ise, VST'leri atlayın ve midi'yi doğrudan kaydedin.

Kendinize FFT'yi ve bunun müzikle nasıl ilişkili olduğunu öğretmek istiyorsanız, Matlab gibi herhangi bir verinin FFT'sini hesaplayabileceğiniz bir şey elde etmek daha iyidir. Wav dosyalarını ve benzerlerini okuma ile birlikte kaydetme ve oynatma yeteneğine sahiptir. Bunlar daha sonra kullanımı kolay olacak. Sözdizimini biliyorsanız, sesi grafiklendirebilir ve her türlü analizi oldukça hızlı yapabilirsiniz.

Böyle bir şey yapmak için bir cihaz oluşturmak istiyorsanız oldukça karmaşıktır. Hesaplamaları yapmak için bir uC / dsp / fpga / etc'ye ihtiyacınız olacak. Çoğu popüler cihaz zaten FFT koduyla birlikte gelir, bu yüzden kendiniz kodlamanız gerekmez (ayrıca karmaşık).

Devreyi ve tüm bunları inşa etmeniz gerekecek. Zor değil ama deneyiminize / bilginize bağlı olarak biraz zaman alabilir ve dik bir öğrenme eğrisi vardır. Aynı zamanda nihai ürünün kalitesine de bağlıdır.

Matematiksel olarak, ideal bir nota "temel" in geometrik bir serisinden oluşur.

F0'ın temel frekans olduğunu varsayalım, o zaman çoğu nota F (t) + F0 * toplamıyla (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 + ile yaklaşacaktır. ...

A_k, F_k'nin bu yüksek frekanslarının gücüdür ve F_k, F0'ın sadece birkaç katıdır. Tüm k için a_k = 0 ise, saf bir sinüzoid var. Bunun perdesini tespit etmek kolaydır. Sadece FFT'nin maksimum değerini bulun ve bu frekans tonun temelidir = nota.

FFT'yi aldığınızda, sonuç veren veriler elde edersiniz ve sadece matematik yaparsınız. Temel olarak kalkülüs.

Tüm bunlar nispeten kolaydır.

Başa çıkmanız gereken bazı problemler. Bunların hepsinin "çözülmediğini" unutmayın.

  1. Gecikme - Herhangi bir tür gerçek zamanlı iş yapacaksanız, bu bir sorun haline gelebilir.

  2. Çoklu notalar - Tüm ekstra harmonikler nedeniyle nota grubunu belirlemek zordur. Oyun A = 440hz ve A '= 880hz ise, harmoniklerin çoğu üst üste binecektir. Kolayca A = 440hz elde edebilirsiniz, ancak A '= 880hz elde etmek daha zordur. Akorları, hızlı koşuları vb. Düşündüğünüzde, tüm bilgileri (notları) tam olarak almak çok zor olabilir. Her şey genellikle matematiksel olarak olası olsa da, verilerin kendisinde hatalar ve sapmalar vardır ve bazı durumlarda denklemler az tanımlanmıştır.

  3. Gürültü - Sinyaldeki gürültü size sahte sonuçlar verebilir. Müzikal bir gürültü meydana gelirse sonuçlarınızı bozabilir. Daha iyi algoritmalar gerekli olacaktır = zaman + para + bilgi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.