Spektrogram oluşturma


10

Bu görev için mantığı çözmeye çalışıyorum ve hızlı fourier dönüşümünü gerçekleştirmek için KissFFT kaynak paketini kullanmayı planlıyorum. Bunun doğru görünüp görünmediğini lütfen bize bildirin:

  1. Bir FFT yapısı tahsis edin, yani. kiss_fft_alloc(N,0,NULL,NULL) Kullandığım Npencere boyutu nerede . Giriş arabelleği, bir Ntür elemanlar dizisi olacaktır kiss_fft_scalar. Çıktı tamponu bir N/2 + 1tür elemanlar dizisi olacaktır kiss_fft_cpx.
  2. NPCM örneklerinin kod çözme (pencere boyutu) sayısı.
  3. Her PCM örneği için, her bir kanalın genliğini (işaretsiz örnekler) ortalayın ve 0 ile 2 arasında ölçeklendirin (65536.0'a bölün) ve sonucu giriş arabelleğine kaydedin.
  4. Giriş arabelleğinde pencereleme (örn. Hanning) gerçekleştirin.
  5. Çıkış arabelleğine kaydederek, giriş arabelleğinde hızlı fourier dönüşümü gerçekleştirin. Giriş olarak gerçek değerleri kullandığım için kullanabilirim kiss_fftr().
  6. İçin N/2çıkış değerlerinin, dönüştürülmüş veri karesi alınan büyüklüğü elde edilir ve şu formül ile dB ölçeğinde değerleri dönüştürmek: 10 * log10 (re * re + im * im)
  7. N/26. adımdaki değerleri çizin .
  8. Bir sonraki (pencere boyutu / 2) PCM örneklerinin kodunu çözerek ve verilere ölçekleme ve pencereleme gerçekleştirerek giriş arabelleğinin ilk yarısını atın. Bu, giriş penceresini etkili bir şekilde kaydırmalı ve işlenmiş PCM örneklerinde matematiği yeniden yapmak zorunda kalmamalıdır.
  9. Tüm örnekler işlenene kadar bu adımları tekrarlayarak 5. adıma geçin.
  10. Kullanılan hafızayı boşaltın kiss_fft_alloc().

FFT'yi gerçekleştirmeden önce giriş penceresinden bir değer çıkarmam önerildi, böylece elde edilen DC değeri sıfır büyüklüğüne sahip oldu. Girdi verilerinden ortalamayı mı yoksa ortalamayı mı çıkarmalıyım?

Ayrıca, bir pencere boyutu seçerken dikkate almam gereken şeyler nelerdir? Bunun yanı sıra, KissFFT'nin talimatlarına göre çift sayı olması gerekir, yani küçük bir pencere boyutu kullanmanın bir yararı vardır. daha iyi bir grafik sağlayacak mı? Büyük bir pencere boyutunun gerçekleştirilmesi gereken FFT sayısını azalttığını varsayıyorum, büyük bir pencere boyutu kullanmanın tek yararı bu mu?

x

Sağlayabileceğiniz her türlü rehberlik için şimdiden teşekkür ederiz.

Yanıtlar:


8

Bana oldukça iyi gözüküyor. Yine de 3. adımda, sinyali -1'den 1'e ölçeklemek istersiniz, aksi takdirde DC eklersiniz. Ortalamayı çıkartmaktan bahsettiniz - bunu bir spektrogram için yapmanızı önermem, çünkü bu DC'yi etkili bir şekilde filtreliyor, spektrogramın orada olup olmadığını göstermesi gerekiyor.

Bir pencere boyutu seçmek tamamen ödünleşmeyle ilgilidir. Daha büyük bir pencere size daha keskin bir frekans çözünürlüğü, ancak daha bulanık zaman çözünürlüğü verecektir. Daha kısa bir pencere size tam tersini verir: daha keskin zaman çözünürlüğü ancak daha bulanık frekans çözünürlüğü. Uygun pencere boyutu seçimi, analiz etmeye çalıştığınız verilere bağlı olacaktır. Tipik olarak 2'nin gücü olacaktır, çünkü FFT'ler 2'nin güçlerini sevme eğilimindedir. çözmek.

Bu ödünleşmeyle daha iyi başa çıkmanın mümkün olup olmadığını merak edebilirsiniz ve bunun için teknikler vardır: genellikle birkaç farklı FFT boyutuna sahip spektrogramları aynı anda hesaplamayı ve birleştirmeyi içerirler. Bu web sayfasında bazı iyi görsel bilgiler var: http://www.izotope.com/tech/aes_adapt/

Pencere boyutunuz çok küçükse, her ikisi de aynı FFT kutusuna sahip oldukları için birbirinden ayırt edilemeyecek iki frekans birbirinden ayırt edilemeyebilir. Pencere boyutunuz çok büyükse, iki yakın olay zaman içinde birleştirilebilir veya keskin bir geçici bir aşamalı saldırıya dönüşebilir. Bunu görselleştirmenin bazı yolları için yayınladığım web sayfasına bakın.

Daha büyük bir pencere boyutu mutlaka FFT sayısını azaltmaz. FFT boyutunun yarısında bir çakışma olan kısa süreli bir Fourier dönüşümü kullanarak bir spektrogram hesaplamayı seçtiniz. İsterseniz daha yüksek bir çakışma faktörü kullanabilirsiniz. Bir pencere boyutu seçmek, kaç FFT'nin hesaplanması gerektiğinden çok zaman / frekans dengesini oluşturma meselesidir. Bir spektrogram (veya herhangi bir STFT) tasarlarken, pencere boyutunu ve atlama boyutunu , bloklar arasındaki mesafeyi bağımsız parametreler olarak seçmeyi düşünebilirsiniz .

Bunu çizdiğinizde, zaman genellikle x ekseninde, frekans y ekseninde (genellikle bir doğrusal ölçek yerine bir günlük ölçeği, Mel ölçeği, vb.) Ve daha sonra büyüklükler renk yoğunluğu ile temsil edilir, yani çok koyu renkler küçük büyüklüklere, çok parlak renkler büyük büyüklüklere karşılık gelir.


Bağlantınız ölü gibi görünüyor. Güncelleyebilir misiniz?
Daniel Wolf
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.