Bir dalga formunun PDF'sini örneklerinden hesaplamak


27

Bir süre önce dijital dalga formları çizmek için farklı yollar deniyordum ve denediğim şeylerden biri, genlik zarfının standart silueti yerine, onu bir osiloskop gibi göstermek içindi. Bu, bir sinüs ve kare dalganın bir kapsamda nasıl göründüğüdür:

görüntü tanımını buraya girin

Bunu yapmanın saf yolu:

  1. Ses dosyasını çıkış görüntüsündeki yatay piksel başına bir öbeke bölün
  2. Her yığın için örnek genlik histogramını hesaplayın
  3. Histogramı, parlak bir piksel pikseli sütunu olarak çizin

Böyle bir şey üretir: görüntü tanımını buraya girin

Her yığın için çok sayıda örnek varsa ve sinyalin frekansı örnekleme frekansı ile ilişkili değilse, aksi halde işe yaramazsa bu iyi sonuç verir. Sinyal frekansı örnekleme frekansının tam bir alt sınıfı ise, örneğin, numuneler her döngüde tam olarak aynı genlikte gerçekleşecek ve gerçek yeniden oluşturulan sinyal bu noktalar arasında bulunsa bile, histogram sadece birkaç nokta olacaktır. Bu sinüs atımı yukarıdaki soldaki gibi pürüzsüz olmalıdır, ancak tam olarak 1 kHz olması ve numunelerin her zaman aynı noktalarda meydana gelmesi nedeniyle değildir:

görüntü tanımını buraya girin

Nokta sayısını artırmak için örneklemeyi denedim, ancak bu sorunu çözmüyor, bazı durumlarda sorunların çözülmesine yardımcı oluyor.

Gerçekten sevdiğim şey , sürekli yeniden oluşturulmuş sinyalin gerçek PDF'sini (olasılık vs genlik) dijital örneklerinden (genlik vs zaman) hesaplamak için bir yol . Bunun için hangi algoritmayı kullanacağımı bilmiyorum. Genel olarak, bir fonksiyonun PDF'si, ters fonksiyonunun bir türevidir .

Günah PDF'si (x): ddxarcsinx=11-x2

Fakat bunun tersinin çok değerli bir fonksiyon olduğu dalgalar için nasıl hesaplanacağını ya da nasıl hızlı yapılacağını bilmiyorum. Bölmek dalları ve her tersini hesaplamak, türev almak ve hepsini buluşmanızı özetlemek? Ama bu oldukça karmaşık ve muhtemelen daha basit bir yol var.

Bu "enterpolasyonlu verilerin PDF'si", bir GPS izinin çekirdek yoğunluğu tahminini yapmak için yaptığım bir girişim için de geçerlidir. Halka şeklinde olması gerekirdi, ancak sadece numunelere baktığından ve numuneler arasındaki enterpolasyon noktaları göz önüne alınmadığından, KDE halkadan çok kambur gibi görünüyordu. Numunelerin hepsi bildiğimiz kadarıyla yapabileceğimiz en iyi şey budur. Fakat örnekler bildiğimiz kadarıyla değil. Ayrıca örnekler arasında bir yol olduğunu biliyoruz. GPS için, sınırsız ses için olduğu gibi mükemmel bir Nyquist rekonstrüksiyonu yoktur, ancak enterpolasyon fonksiyonundaki bazı tahminlerle temel fikir hala geçerlidir.


İlgilendiğiniz çok değerli bir fonksiyon örneğiniz var mı? Muhtemelen fiziksel verileriniz için en anlamlı olan bir şube kesiği boyunca değerlendirmeniz gerekecektir.
Lorem Ipsum

Bu tür bir arsa çizme yöntemleriyle daha mı fazla ilgileniyorsunuz, yoksa arsa PDF'yi hesaplamakla ilgili soru için sadece bir motivasyon mu?
datageist

@yoda: Sinüs dalgası için yukarıdaki fonksiyon, sadece yarım devir alarak, türevini tersine çevirerek ve alarak, çünkü her yarım devir bir sonraki ile aynı PDF'ye sahiptir. Ancak, rastgele bir ses sinyalinin değerini almak için, bu varsayımı yapamazsınız. Bence "dallanmalara" bölmeniz, her birinin PDF'sini almanız ve hepsini bir araya getirmeniz gerekebilir mi?
Endolith

@datageist: Hmm. Ben arsa bu tür çizmek için yollar ilgilenen değilim, ama arsa bu tür bir PDF. Aynı veya çok benzer sonuç üreten bir kısayol tamam.
Endolith

@ endolith, Ah evet, anlıyorum. Gerçekten vurgu ile ilgili sadece bir soru (yani hangi kısayol türlerinin makul olduğu).
datageist

Yanıtlar:


7

Orijinal oranın birkaç katına enterpolasyon yapın (örneğin 8x fazla örneklenmiş). Bu, parçalı bir lineer sinyal almanızı sağlar. Bu sinyalin sonsuz çözünürlüğü, dalga şeklinin sürekli sin (x) / x enterpolasyonu ile karşılaştırıldığında çok az hata olacaktır.

Her aşırı örneklenmiş değer çiftinin bir değerden diğerine sürekli bir çizgiye sahip olduğunu varsayalım . Arasındaki tüm değerleri kullanın . Bu, isteğe bağlı bir çözünürlükte PDF olarak biriktirmeniz için y1'den y2'ye bir ince yatay dilim verir. Her bir dikdörtgen olasılık dilimi, 1 / ns örnek alana ölçeklendirilmelidir.

Numunelerin kendileri yerine numuneler arasındaki çizginin kullanılması, örnekleme periyodu ile dalga formu arasında temel bir ilişki olduğu durumlarda bile "spikey" bir PDF'yi önler.


Doğrusal enterpolasyonlu histogram için bir fonksiyon yazdım, ancak çok tehlikeli. Bunun için mevcut kod biliyor musunuz?
Endolit

Doğrusal enterpolasyon, çoğu örneklemede bile olmasa bile çoğu dalga formu için büyük bir fark yaratır. 1 kHz sinüs, günümüzde çoğunlukla 997 Hz sinüs gibi gözükmektedir. Örnek değerlerinde sadece yatay çizgiler yerine, şimdi aralarında yatay renk bantları var. Aşırı örneklemeyle, bantlar da düzeltir. FFT yeniden örnekleme ve bazı parçaların bitişik parçalarla üst üste gelmesiyle, gerçek örnek örnek zirvelere ulaşmasını sağlayabilmeliyim. İnterpolasyonlu histogram kodumu daha hızlı hale
getirmem gerekiyor

Ben tamamen bu benim komut yeniden yazdı ve ben histogramı ve bu kez doğru antialiasing var düşünüyorum: gist.github.com/endolith/652d3ba1a68b629ed328
Endolit


7

Ben esas olarak Jason R’ın “rasgele örnekleyici” olduğunu düşünüyorum, bu da yoda'nın stokastik örneklemesinin örneklenmiş sinyal tabanlı bir uygulamasıdır.

Her iki örnek arasında basit bir kübik enterpolasyon kullandım. İlkel bir sentezleme sesi için (doymuş, bantsız, sınırsız kare benzeri bir sinyalden + hatta bir sinyale harmonikten) azalan şuna benzer:

Rastgele yeniden örneklenmiş synth PDF

Bunu daha yüksek örneklenmiş bir sürümle karşılaştıralım,

görüntü tanımını buraya girin

ve tuhaf olanı aynı örnekleme oranıyla fakat enterpolasyonu yok.

görüntü tanımını buraya girin

Bu yöntemin kayda değer bir esası, kare benzeri alandaki aşmadır, ancak bu aslında sinc filtrelenmiş sinyalin PDF'sinin (dediğim gibi, sinyalim bant sınırsız değildir) algılanan ses yüksekliğini daha iyi görmesi ve algılamasıdır. Bu bir ses sinyali olsaydı, zirvelerden daha.

Kod (Haskell):

cubInterpolate vll vl v vr vrr vrrr x
    = v*lSpline x + vr*rSpline x
      + ((vr-vl) - (vrr-vll)/4)*ldSpline x
      + ((vrr-v) - (vrrr-vl)/4)*rdSpline x
     where lSpline x = rSpline (1-x)
           rSpline x = x*x * (3-2*x)
           ldSpline x = x * (1 + x*(x-2))
           rdSpline x = -ldSpline (1-x)

                   --  rand list   IN samples  OUT samples
stochasticAntiAlias :: [Double] -> [Double] -> [Double]
stochasticAntiAlias rs (lsll:lsl:lsc:lsr:lsrr:[]) = []
stochasticAntiAlias (r:rLst) (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)
    = ( cubInterpolate lsll lsl lsc lsr lsrr lsrrr r )
          : stochasticAntiAlias rLst (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)

rand list [0,1] aralığında rastgele değişkenlerin bir listesidir.


1
Muhteşem görünüyor. Haskell kodu için +1.
datageist

Evet, gereken örnek değerler aşmayı. Aslında, her piksel sütunu için bir tepe değere sahip olmayı da planladım, sadece maksimum örneklere değil, maksimum örnekler arası zirvelere dayanarak, muhtemelen farklı çizildi. Flic.kr/p/7QAScX gibi dalga formları bunun neden gerekli olduğunu gösteriyor.
Endolith

"Daha yüksek örneklenmiş versiyon" ile, bunun örneklenmiş olduğunu, ancak hala düzgün bir şekilde örneklenmiş olduğunu mu kastediyorsunuz? Ve bu mavi noktalar?
Endolith

1
@endolith Bu sadece ilk etapta daha yüksek bir örnekleme oranında hesaplanan orijinal dalga şeklidir. Temelde mavi noktalar gibi, 192 kHz'de örneklenmiş bir sesi temsil eder ve en alttaki sarı olanlar, 24 kHz'e kadar naif şekilde yapılmış bir alt örneği temsil eder. Üst sarı noktalar bundan stochasticAntiAlias. Ancak daha yüksek örneklenmiş versiyon, her iki durumda da tekdüze orandır.
leftaroundabout

5

Yaklaşımınız teorik olarak doğru olmakla birlikte (ve monotonik olmayan işlevler için biraz değiştirilmeye ihtiyaç duyar), genel bir işlevin tersini hesaplamak çok zordur. Söylediğiniz gibi, şube noktaları ve şube kesintileri ile başa çıkmak zorunda kalacaksınız, ancak bunu ciddiye almak istemezsiniz.

Daha önce de bahsettiğiniz gibi, düzenli örnekleme örnekleri aynı nokta kümesini temsil eder ve bu nedenle örnekleme yapılmayan bölgelerdeki (Nyquist kriterini yerine getirse bile) kötü tahminlere karşı oldukça hassastır. Bu durumda, daha uzun süre örnekleme de yardımcı olmaz.

Genel olarak, olasılık yoğunluğu fonksiyonları ve histogramları ele alırken, stokastik örnekleme açısından düşünmek çok daha iyi bir fikirdir. normal örneklemeden (giriş için bağlantılı cevaba bakınız). Stokastik örnekleme yaparak, her noktanın "vurularak" eşit olma olasılığına sahip olmasını ve pdf'yi tahmin etmenin çok daha iyi bir yolu olmasını sağlayabilirsiniz.

f(x)=günah(20πx)+günah(100πx)fs=1000fN-=1001000 saniyede örnekler (homojen dağılım) (burada Hz kullanmıyorum, çünkü bu farklı bir anlam ifade ediyor) 30 saniye boyunca sağdaki arsa (aynı bindirmeyi) veriyor.

Gürültülü olmasına rağmen, asıl PDF'ye sağdaki, birkaç aralıktaki sıfırları ve diğer bazılarındaki büyük hataları gösteren yaklaşımdan çok daha iyi bir yaklaşım olduğunu kolayca görebilirsiniz. Daha uzun bir gözlem süresine sahip olarak, sağdaki bir varyansı azaltabilir, sonunda büyük gözlemler sınırındaki tam PDF'ye (kesikli siyah çizgi) yakınlaşabilirsiniz.

görüntü tanımını buraya girin


1
"Genel bir fonksiyonun tersini hesaplamak oldukça zor" Peki, bu bir dizi örnek kadar bir fonksiyon değildir, bu yüzden tersini bulmak sadece örneklerin x ve y koordinatlarını değiştirmek ve sonra tekrar sığdırmak içindir. Yeni koordinat sistemi. Örneklemeyi zaten değiştiremiyorum. Tek tip örnekleme kullanılarak oluşturulan önceden var olan verilerden bahsediyoruz.
Endolith

4

Çekirdek Yoğunluğu Tahmini

Bir dalga formunun PDF'sini tahmin etmenin bir yolu, bir çekirdek yoğunluğu tahmincisi kullanmaktır .

x(n)K(x)δ(x-x(n))P^

P^(x)=Σn=0N-K(x-x(n))

Güncelleme: İlginç ek bilgiler.

x(n)n=0,1,...,N--1X(k)

X(k)=Σn=0N--1x(n)e-ȷ2πnk/N-

X(k)eȷ2πnk/N-

x(n)=1N-Σk=0N--1X(k)eȷ2πnk/N-

Öyleyse, bir sonraki Fourier bileşeninin tüm PDF'lerini birlikte hazırlamak için ne olacağınıza dair bir tahmin yapın :

|X(k)|11-x2

X(k)x(n)

Yine de daha fazla düşünce gerekli!


Bunu düşündüm, fakat bilinmeyen bir olasılık yoğunluk fonksiyonunu tahmin etmek için yoğunluk tahmini kullanılır . Nyquist örnekleme teoremi nedeniyle tüm dalga formu tam olarak bilinir ve kesin olasılık yoğunluk fonksiyonu da bilinmelidir. Hızın doğrulukla değiş tokuş yapıp yapamayacağını tahmin ediyorum, ancak asıl PDF'yi çıkarmanın bir yolu olmalı. Gibi, her numuneye bir sinc işlevi koyarak ve bir araya toplayarak yeniden oluşturulmuş bir dalga formu yapılabilir. Bir sinc işlevinin PDF'si çekirdek olarak kullanılarak PDF oluşturulabilir mi? Böyle çalıştığını sanmıyorum.
Endolith

Mesela, bunun sinyal örneklerinin örnekleme frekansının bir alt sınıfı olduğu sorunu çözmediğini düşünüyorum. Örnekler arasında yeniden oluşturulmuş dalga biçimini dikkate almaz, değil mi? Sadece boşlukları doldurmaya çalışmak için PDF'deki her noktayı bulanıklaştırır. Bir GPS izinin çekirdek yoğunluk tahminini yapmaya çalışırken de benzer bir sorun vardı çünkü örnekler arasındaki değerleri hesaba katmıyor.
Endolith

4

Yorumlarınızdan birinde belirtildiği gibi, yeniden oluşturulan sinyalin histogramını yalnızca örnekleri ve bantsız sinyalleri enterpoze eden sinc fonksiyonunun PDF'sini kullanarak hesaplayabilmek cazip olacaktır. Ne yazık ki, bunun mümkün olduğunu sanmıyorum çünkü sinc'in histogramı sinyalin kendisinde olan tüm bilgilere sahip değil; Her bir değerin karşılaştığı zaman alanı pozisyonları ile ilgili tüm bilgiler kaybedilir. Bu, sincin ölçeklendirilmiş ve zaman gecikmeli versiyonlarının nasıl toplanacağını modellemeyi imkansız kılar, yani sinyalin "sürekli" veya yukarı örneklenmiş versiyonunun histogramını fiili olarak yapmadan hesaplamak için ne isteyeceksiniz? yukarı örnekleme.

En iyi seçenek olarak enterpolasyondan ayrıldığınızı düşünüyorum. Bu konuyu istemenizi önleyen birkaç konuyu belirttiniz, bence çözülebilir:

  • Hesaplama gideri: Bu, elbette, bunu kullanmak istediğiniz özel uygulamaya bağlı olarak her zaman göreceli bir sorundur. Topladığınız render galerisine gönderdiğiniz bağlantıya dayanarak, bunu ses sinyallerinin görselleştirilmesi için yapmak istediğinizi farz ediyorum. Gerçek zamanlı veya çevrimdışı bir uygulama için bu konuyla ilgileniyor olsanız da, verimli bir enterpolatör prototiplemenizi ve gerçekten çok pahalı olup olmadığını görmenizi öneririm. Çok fazlı yeniden örnekleme , esnek yapmanın iyi bir yoludur (herhangi bir rasyonel faktörü kullanabilirsiniz).

  • π


Fakat dalga şekli 44.1 / π kHz'de ise ne olur? :) Bu iyi bir tavsiye olsa da. Rasgele yeniden örnekleme diye bir şey var mı? Ya da gerçekten, bence mükemmel olan şey düzgün olmayan bir şekilde yeniden örneklemektir, böylece yeni örnekler x boyutunda eşit aralıklarla yerleştirilmek yerine, y boyutundaki kutulara mükemmel bir şekilde uyar. Bunu yapmanın bir yolu olup olmadığından emin değilim
endolith ile

2
Farrow yapısını kullanarak kolayca "rastgele" bir yeniden örnekleyiciyi uygulayabilirsiniz. Polinomları (genellikle kübik) kullanarak enterpolasyon yaparak rastgele kesirli örneklem gecikmesine izin veren bir şemadır. Bir NCO'da kullanılana benzer olan, her çıkış (yeniden örneklenen) numunesi için bir örnekleme aralığının sözderandom fraksiyonları ile artırılan, bir numuneler arası faz akümülatörünü koruyabilirsiniz . Akümülatörün değeri, her çıkış için kesirli gecikme miktarını tanımlayan Farrow enterpolatörüne bir girdi olarak kullanılır.
Jason R

Hmm, açıklığa kavuşturmak için, Farrow normal eski polinom enterpolasyonunun sadece bir işlemci / bellek için optimize edilmiş versiyonudur.
Endolith

1
Evet. Polinom tabanlı rasgele kesirli gecikme uygulamak için sadece etkili bir yapıdır.
Jason R

Kübik enterpolasyon, ancak bir yaklaşımdır. Gerçek örnekler arası zirveleri bilmek istiyorum ve aşırı zirvelerde iyi sonuç vermiyor gibi görünüyor: stackoverflow.com/questions/1851384/… Aslında, süreksizliği olan sonsuz bir seri [..., -1, 1, -1, 1, 1, -1, 1, -1, ...], sonsuz bir örnek içi pik üretecek, ancak pratikte bunun ne kadar önemli olacağından emin değilim.
Endolit

0

Histogramı düzleştirmeniz gerekir (bu, bir çekirdek yöntemi kullanmakla aynı sonuçları verir). Tam olarak pürüzsüzleştirmenin nasıl yapılması gerektiğinin denenmesi gerekir. Belki enterpolasyon ile de yapılabilir. Düzeltme işlemine ek olarak, dalga biçiminizi örnekleme frekansının girişinizdeki en yüksek frekanstan “önemli ölçüde yüksek” olacak şekilde örneklendirirseniz gelişmiş sonuçlar alacağınıza inanıyorum. Bu, sinüs dalgasının örnekleme frekansıyla ilgili olduğu “zor” durumda, histogramdaki sadece birkaç bölmenin doldurulacağı şekilde yardımcı olmalıdır. Aşırı alındığında yeterince yüksek bir örnekleme oranı yumuşatmadan size güzel araziler vermelidir. Bu nedenle, bir çeşit yumuşatma ile birleştirilmiş örnekleme daha iyi grafikler vermelidir.

Grafiğin beklediğiniz gibi olmadığı bir 1kHz ton örneğini veriyorsunuz. İşte teklifim (Matlab / Octave kodu)

pixels_vertical = 100;
% This needs to be tuned to your configuration and acceptance
upsampling_factor = 16*(pixels_vertical/100); 
fs_original = 48000;
fsine = 1000; % in Hz
fs_up = upsampling_factor*fs_original;
duration = 1; % in seconds
x = sin(2*pi*fsine*[0:duration*fs_up]/fs_up);
period_in_samples = fs_up/fsine;
hist_points = linspace(-1,1,pixels_vertical);
istart = 1;
iend   = period_in_samples;
pixel_values = hist(x(istart:iend), hist_points);
% smooth pixel values
[b,a] = butter(2,0.2);
pixel_values_smooth = filtfilt(b,a,pixel_values);
figure;hold on;
plot(hist_points, pixel_values);
plot(hist_points, pixel_values_smooth,'r');

1000Hz tonunuz için bunu görüntü tanımını buraya girin

Yapmanız gereken, upsampling_factor ifadesini tercihinize göre ayarlamaktır.

Hala% 100 tam olarak ihtiyaçlarınızın neler olduğundan emin değil. Fakat yukarıdaki örnekleme ve yumuşatma prensibini kullanarak bunu 1kHz tonu (Matlab ile yapılan) için alacaksınız. Ham histogramda, sıfır isabetli birçok kutu olduğunu unutmayın.

görüntü tanımını buraya girin


Evet, algoritmanın bir parçası olarak gerçekten bir çeşit enterpolasyona ihtiyaç duyuyor. Histogramı tek başına düzgünleştirmek bunu yapmaz, çünkü histogram yeniden yapılandırılmış dalga biçiminden değil, ayrı noktalardan oluşur. Örneklemenin çalışmasının tek yolu, onu dikey piksellerden daha fazla örneğin bulunduğu noktaya yaparsam, ama bu uzun zaman alan ağır kaba kuvvet yöntemidir.
Endolith

veya enterpolasyonun, enterpolasyon olmadan çıkış üzerindeki etkisinin hesaplanması
endolith
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.