Soru PCM veya WAV örneğinin temel sıklığını nasıl analiz edersiniz?


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.


25
2017-09-15 18:10


Menşei




Cevaplar:


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.


19
2017-07-14 20:06



Kayıp temellerin yanı sıra, telli enstrümanlardan gelen sinyaller üzerinde durmak için sempatik rezonans da söz konusudur. Özellikle gitar için enstrüman ayarlama senaryosunda, herhangi bir zamanda ayarlanmayan dizeler açık ve ayarlı dizgeye yakınsa çalınan dizgeyle kesişen bölümlere rastlanır. - marko


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).


17
2017-09-19 04:03



Bu cevabı birkaç kez oylamak istiyorum. FFT'ler bu soruna korkunç bir çözümdür; Markete bir tank sürmek gibi. Elbette, bu harika, ama gerçekten en iyi yol değil. Otokorelasyon genellikle bu problemin DOĞRU çözümü olarak kabul edilir; viz Autotune / Melodyne / Singstar / siz adlandırın. Sıfır çapraz tabanlı çözümler, hermonik davranış hakkında SPECIFIC bilginiz olduğunda YALNIZCA UYGULANABİLİR. Otokorelasyon da çok verimli bir şekilde uygulanabilir. - Dave Gamble
Whoa, ne? Katılmıyorum. Bir frekans alanı çözümü kesinlikle hiç de korkunç bir çözüm değildir. Harmonik ürün spektrumu veya sefalet metotları uygulanması kolaydır ve makul derecede sağlamdır. Otokorelasyon değil genellikle RIGHT çözümünü herhangi bir yöntemle değerlendirmek; çeşitli geçerli çözümlerden biridir. Doğru, ancak: sıfır geçişi, sahada güvenilir bir gösterge değildir. - Steve Tjoa
Otokorelasyon genellikle FFT'lerden daha hesaplamalıdır. Aslında, daha hızlı olduğu için otokorelasyon yapmak için FFT'leri kullanıyoruz. FFT'lerle yapabileceğiniz naif otokorelasyonu kullanmak, ön kapıyı kullanmak yerine bir bakkalın duvarından bir tank sürmek gibidir. - endolith


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!


5
2017-09-15 18:14



Bu yaklaşım, özellikle müzik bağlamında ciddi doğruluk problemlerine sahiptir. Endolitin işaret ettiği gibi, FFT size bir dizi frekansta yoğunluk verir; aralık, daha küçük (ve daha hızlı) FFT pencere boyutu daha büyüktür. Daha da kötüsü, genel aralık 0 ila 44100 Hz (redbook ses için), tipik bir müzik notası hemen hemen her zaman 1000Hz'nin altındadır, dolayısıyla sahip olduğunuz çözünürlüğün çoğu daha yüksek frekans bantlarında harcanır. - MusiGenesis


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.


5
2017-09-15 18:33



Sadece sıfır geçişlerini saydıklarından şüpheliyim. Tipik bir gitar dalga formunda döngü başına birçok sıfır geçişi vardır. flickr.com/photos/56868697@N00/4180888094  Muhtemelen basit bir otokorelasyon yaparlar. - endolith
Basit bir tuner için daha fazla sıfır geçişi gerçekten önemli değil. Bir tunerin temelin tam frekansına ihtiyacı olmadığını unutmayın. Notu bilmesi gerekiyor. Her döngüde daha fazla sıfır geçişi saymak daha yüksek bir oktavda kilitlenebilir, ancak bir Cb hala bir Cb olacaktır ve iki sent çok yüksek, iki sent de çok yüksek olacaktır. Otokorelasyon daha gelişmiş işlemler için mükemmeldir, ancak bir radyo alıcısı için fazladır. - Mendelt


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 ;

4
2017-09-16 22:29



Özlü sadeliği severim ama for döngüsü ile ilgili bir problemden şüpheleniyorum. Çıkış, kesinlikle girişle aynı boyutta olmayacaktır. - Waslap
Tam olarak aynı boyutta. Bir FFT yapmak bir zorunluluktur - sadece geniş bir zaman aralığını analiz ederek ince frekans çözünürlüğüne (birçok çıkış kutusu) sahip olabilirsiniz. Eğer analizi çok hassas bir zamanla sınırlarsanız (küçük giriş örnek boyutu), frekans alanında düşük çözünürlük elde edersiniz. - AShelly


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 ...


3
2017-07-15 12:50





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.


1
2017-09-15 18:16