DirectX'ten bir tamponda tutulan bir örneğim var. Bir enstrümandan çalınan ve yakalanan bir nota örneği. Numunenin frekansını nasıl analiz ederim (gitar tuneri gibi)? FFT'lerin dahil olduğuna inanıyorum, ancak NASIL'larıma dair hiçbir işaretim yok.
DirectX'ten bir tamponda tutulan bir örneğim var. Bir enstrümandan çalınan ve yakalanan bir nota örneği. Numunenin frekansını nasıl analiz ederim (gitar tuneri gibi)? FFT'lerin dahil olduğuna inanıyorum, ancak NASIL'larıma dair hiçbir işaretim yok.
FFT, frekansın nerede olduğunu belirlemenize yardımcı olabilir, ancak size söyleyemez. kesinlikle frekans nedir. FFT'deki her nokta bir "bin" frekansıdır, bu yüzden FFT'nizde bir zirve varsa, tek bildiğiniz, istediğiniz frekansın o bölmenin içinde veya frekans aralıklarında bir yerde olmasıdır.
Gerçekten doğru bir şekilde istiyorsanız, yüksek çözünürlüklü ve çok sayıda kutuya sahip uzun bir FFT'ye ihtiyacınız var (= çok sayıda bellek ve çok sayıda hesaplama). Ayrıca düşük çözünürlüklü bir FFT kullanarak gerçek zirveyi tahmin edebilirsiniz. ikinci dereceden enterpolasyon Şaşırtıcı derecede iyi çalışan, log-scaled spektrumunda.
Hesaplama maliyeti en önemliyse, sinyali sıfır geçişleri sayabileceğiniz bir formata sokmayı deneyebilirsiniz, ve daha sonra saydıkça, ölçümleriniz o kadar doğru olur.
Bunlardan hiçbiri işe yaramazsa temel eksikolsa da. :)
Birkaç farklı algoritmayı özetledim İşteve enterpolasyonlu FFT genellikle en doğrudur (ancak bu sadece çalışır temel en güçlü harmonik olduğunda - aksi halde, onu bulmak için daha akıllı olmanız gerekir), sıfır geçişler ile yakın bir saniye (bu sadece işe yarıyorsa) döngü başına bir geçişi olan dalga formları için). Bu koşullardan hiçbiri tipik değildir.
Temel frekansın üstündeki kısmi kısımların olduğunu unutmayın. değil piyano veya gitar gibi birçok enstrümanda mükemmel harmonikler. Her kısmi aslında biraz ayarlanmışveya inharmonic. Bu nedenle FFT'deki daha yüksek frekanslı pikler, temelin tamsayı katları üzerinde tam olarak olmayacak ve dalga şekli, bir döngüden diğerine bir miktar değişecek ve bu da otokorelasyonu yok edecektir.
Gerçekten doğru bir frekans okuması elde etmek için, özdeğeryi tahmin etmek için otokorelasyonu kullanacağımı söyleyebilirim, daha sonra da ikinci dereceden enterpolasyonu kullanarak gerçek zirveyi bulun. (CPU döngülerini kaydetmek için frekans alanında otokorelasyon yapabilirsiniz.) Bir sürü gotcha var ve kullanmak için doğru yöntem gerçekten uygulamanıza bağlıdır.
Ayrıca zaman tabanlı, frekans tabanlı olmayan başka algoritmalar da vardır. Otokorelasyon, saha tespiti için nispeten basit bir algoritmadır. Referans: http://cnx.org/content/m11714/latest/
Okunabilir otokorelasyon ve diğer algoritmaların c # uygulamalarını yazdım. Çıkış yapmak http://code.google.com/p/yaalp/.
http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio Dosyaları listeler ve PitchDetection.cs istediğinizdir.
(Proje GPL'dir, bu yüzden kodu kullanırsanız şartları anlayın).
FFT'ler (Hızlı Fourier Dönüşümleri) gerçekten dahil olacaktı. FFT'ler, herhangi bir analog sinyali, sabit frekansların ve değişen genliklerin basit sinüs dalgalarının toplamı ile yaklaştırmanızı sağlar. Esasen yapacağınız şey bir örnek almak ve genlik-> frekans çiftlerine ayrıştırmak ve daha sonra en yüksek genliğe karşılık gelen frekansı almaktır.
Umarım bir başka SO okuyucu teori ve kod arasında bıraktığım boşlukları doldurabilir!
Gitar tunerler FFT veya DFT kullanmazlar. Genellikle sıfır geçişlerini sayıyorlar. Temel frekansı alamayabilirsiniz çünkü bazı dalga şekilleri diğerlerinden daha fazla sıfır geçişine sahiptir, ancak genellikle temel frekansın çoğunu bu şekilde alabilirsiniz. Bir veya daha fazla oktav olmasına rağmen notu almak için yeterli.
Sıfır geçişleri saymadan önce düşük geçişli filtreleme genellikle sıfır geçişlerinin aşılmasına neden olabilir. Düşük geçiş filtresini ayarlama, tespit etmek istediğiniz frekans aralığındaki bazı bilgileri gerektirir.
Biraz daha spesifik olarak:
Bir giriş dizisinde ham PCM ile başlarsanız, temel olarak sahip olduğunuz zaman, dalga genliğinin zamana karşı bir grafiğidir. Bir FFT'nin yapılması, 0 ile 1/2 arasındaki frekanslar için giriş örnekleme oranı için bir frekans histogramına dönüşür. Sonuç dizisindeki her girişin değeri, karşılık gelen alt frekansın 'gücü' olacaktır.
Bu nedenle, S örneklerinde / saniyede örneklenen N boyutundaki bir giriş dizisi verildiğinde kök frekansını bulmak için:
FFT(N, input, output); max = max_i = 0; for(i=0;i<N;i++) if (output[i]>max) max_i = i; root = S/2.0 * max_i/N ;
PCM ses sinyalindeki temel frekansların alınması zor bir görevdir ve bunun hakkında konuşacak çok şey olacaktır.
Neyse, genellikle zaman tabanlı yöntem polifonik sinyaller için uygun değildir, çünkü çoklu temel frekanslardan dolayı farklı harmonik bileşenlerin toplamı tarafından verilen karmaşık bir dalga, sadece en düşük frekans bileşenine bağlı olan bir sıfır geçiş hızına sahiptir. Ayrıca frekans alanında FFT en uygun yöntem değildir, çünkü notalar arasındaki frekans aralığı doğrusal değil üstel bir skalayı takip eder. Bu, FFT yönteminde kullanılan sabit bir frekans çözünürlüğünün, zaman alanındaki analiz penceresinin boyutu yeterince büyük değilse, daha düşük frekans notlarını çözmek için yetersiz olabileceği anlamına gelir.
Daha uygun bir metot, farklı frekanslarda farklı alt bantların elde edilmesi için, düşük geçişli bir filtreleme işleminden ve sinyalin 2 (her bir aşamada örnekleme frekansının kesilmesi) işleminden sonra uygulanan DFT'nin sabit bir Q dönüşümüdür. çözüm. Bu şekilde DFT'nin hesaplanması optimize edilmiştir. Sorun şu ki, zaman çözünürlüğü de değişkendir ve alt alt bantlar için artar ...
Son olarak, tek bir notun temel frekansını tahmin etmeye çalışıyorsak, FFT / DFT yöntemleri iyi. Her şey farklı seslerin kısmi kısımlarının üst üste geldiği ve faz farklarından kaynaklanan genliklerini toplamış / iptal ettiği ve böylece tek bir spektral pikin farklı harmonik içeriklere (farklı notalara ait) ait olabileceği polifonik bir bağlam için şeyler değişir. Bu durumda korelasyon iyi sonuç vermez ...
Uygulayın DFT ve daha sonra temel frekansı sonuçlardan elde eder. DFT bilgisi için etrafta dolaşmak, ihtiyacınız olan bilgiyi size verecektir - sizi bir kısmına bağlarım, ancak matematik bilgilerinin beklentilerinde büyük farklılıklar gösterir.
İyi şanslar.