Anlık frekansı hesaplama ve yorumlama


9

Anlık frekansı hesaplama ilkesinde yeniyim ve üzerinde birçok soru ortaya çıktı. Hepsini bu metnin sonunda bir madde işareti listesinde bulabilirsiniz. Metin biraz uzun olabilir, bunun için beni affedin, ama gerçekten bu sorun üzerinde kendi başıma çalışmaya çalıştım.

Bu yüzden anlık frekansla ilgileniyorum f(t) değerli bir sinyalin x(t). Hesaplama bir analitik sinyal yardımı ile yapılırz(t)=x(t)+jy(t), nerede y(t) nin Hilbert dönüşümüdür .x(t)

Analitik sinyal den anlık frekansları hesaplamak için kağıdı takip ettim:z(t)

1992'den Arthur E. Barns tarafından anlık frekans ve anlık bant genişliğinin hesaplanması. Bu makalede, anlık frekansı hesaplamak için birçok yöntem sunmaktadır. Bir anda önerdiği (ve kullandığım) tüm formülleri yazıyorum.

"Öğrenmek" için, MATLAB'da çok basit ve iki biraz daha karmaşık sinyalle oynadım ve anlık frekanslarını elde etmek istedim.

Fs = 1000;                                            % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs;                                    % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2);                         % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10);        % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10);   % chirp * sin(10Hz), signal 3

Bu üç sinyalin zaman alanındaki grafikler aşağıdaki gibidir: Zaman alanı grafikleri

Kağıttan tüm yöntemleri uyguladıktan sonra aldığım tüm anlık frekansların grafikleri şunlardır:

Saf cıvıltı sinyalinin Saf cıvıltı sinyalinin anlık frekansları anlık frekansları: Sinüsoid eklenmiş cıvıltı sinyalinin Sinüsoid eklendiğinde cıvıltı sinyalinin anlık frekansları ani frekansları: Modüle edilmiş cıvıltı sinyalinin ani frekansları: Modüle edilmiş cıvıltı sinyalinin anlık frekansları Lütfen her üç görüntüde de 3 ve 4 no'lu y-ekseninin yakınlaştırıldığını unutmayın. sinyaller çok küçük!

Analitik sinyalden anlık frekansa ulaşmanın ilk olasılığı: burada anlık fazdır. Bence günümüzde kullanılan en yaygın yöntem budur, en azından MATLAB'ın web sayfasında bu şekilde hesaplanıyor. Kod aşağıdaki gibidir:

f2(t)=12πddtθ(t)
θ(t)

function [instantaneous_frequency] = f2(analytic_signal,Fs)
    factor =  Fs/(2*pi);
    instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

Makalede, Ahırlar şimdi analitik sinyalden anlık frekansları hesaplamanın dört yolunu önermektedir (veya daha doğrusu adı geçen derlemeleri). Üst formülden de bahsediyor, ancak fazdaki belirsizlikler nedeniyle bunun pratik olmadığı görüşündedir. Sanırım, unwrap()yöntemi bilmiyordu ya da arkasındaki matematiği daha kesin olarak tanımıyordu . (Ben, kendim bu yöntemi hemen anladım, anlık frekanslardaki diğer bazı kaynak kodlarına bakarken)

Makalesinde, formülün (2) numaralı etiketi vardır, bu nedenle, f (t) 2 dizinini verdim. Diğer tüm indeksler, kağıttaki sayılarına aynı şekilde karşılık gelir.

Aşamadaki belirsizlikler nedeniyle, şunu önerir:

f3(t)=12πx(t)y'(t)bir-x'(t)y(t)bx(t)2c+y(t)2d
Programlamayı biraz daha kolaylaştırmak için "a", "b", "c" ve "d" sembollerini tanıttım:

function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    diff_x = diff(x);
    diff_y = diff(y);
    factor = Fs/(2*pi);
    a = x(2:end).*diff_y;
    b = y(2:end).*diff_x;
    c = x(2:end).^2;
    d = y(2:end).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

Sonra Barner "anlık frekans yaklaşımı" adını verdiği üç formül daha verir:

f9(t)=12πTarctan[x(t)y(t+T)bir-x(t+T)y(t)bx(t)x(t+T)c+y(t)y(t+T)d]

function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(2*pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = x(1:end-T).*x(1+T:end);
    d = y(1:end-T).*y(1+T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append 0 to return-vector to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

f11(t)=14πTarctan[x(t-T)y(t+T)bir-x(t+T)y(t-T)bx(t-T)x(t+T)c+y(t-T)y(t+T)d]

function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(4*pi*T);
    a = x(1:end-2*T).*y(1+2*T:end);
    b = x(1+2*T:end).*y(1:end-2*T);
    c = x(1:end-2*T).*x(1+2*T:end);
    d = y(1:end-2*T).*y(1+2*T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end

f14(t)=2πT[x(t)y(t+T)bir-x(t+T)y(t)b(x(t)+x(t+T))2c+(y(t)+y(t+T))2d]

function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = 2*Fs/(pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = (x(1:end-T)+x(1+T:end)).^2;
    d = (y(1:end-T)+y(1+T:end)).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

3 yaklaşımın hepsinde Formüller T, kağıtta önerildiği gibi Fs (T = Fs = 1000 = 1s) olarak ayarlandı.

Şimdi sorum şu:

  • Formül f2 ve f3, saf cıvıltı sinyali için aynı sonucu verir. Bence bu aynı şekilde hesapladıkları için iyi. Üç yaklaşım yöntemi aynı şeyi döndürmez, ona yakın bir şey bile değil! Neden böyle? (Umarım sadece bir programlama hatası değildir ...)
  • Her ne kadar aynı dönseler de, özellikle arsa sonunda çok fazla kıpırdatmaya başlarlar . Bunun açıklaması nedir? İlk önce takma ad gibi bir şey düşündüm, ancak örnekleme frekansım, sinyallerin frekansına kıyasla oldukça yüksek, bu yüzden dışlanabilir.
  • En azından f2 ve f3, saf bir cıvıltı sinyali üzerinde uygun çalışıyor gibi görünüyor, ancak sinyalde birden fazla frekans söz konusu olduğunda, f2 ve f3 dahil olmak üzere tüm yöntemler korkunç başarısız görünüyor. Gerçekte bir sinyalde birden fazla frekans olması her zaman böyledir. Peki kişi (daha fazla veya daha az) doğru anlık frekansı nasıl alabilir?

    • Aslında sinyalde birden fazla frekans olduğunda ne olacağını bile bilmiyorum. Hesaplama, belirli bir nokta için bir sayı döndürür, bu nedenle, burada olduğu gibi, daha fazla frekans mevcut olduğunda ne yapmalıdır? Tüm frekansların veya bunun gibi bir şeyin ortalamasını döndürür müsünüz?
  • Ve muhtemelen en önemli sorum şu, bu gerçek ve özenli bir yazılımda nasıl ele alınır? Diyelim ki 1.75 s'de modüle edilmiş sinyalin anlık frekansını bilmek istiyorum ve f2 yöntemini seçtim, 'şanslı' olabileceğimden ve büyük olasılıkla doğru cevap olan 6 [Hz] 'e yakın bir sayı elde ettiğimden veya sonuçlarımı yanında birkaç örnek al ve aniden biraz kablolu, yüksek bir yol alıyorum, çünkü ne yazık ki başakta bir değer seçtim. Bu nasıl ele alınabilir? Ortalama veya daha iyi bir medyan filtre ile postprocessing? Bence bu, özellikle çok sayıda sivri yan yana olan bölgelerde gerçekten zor olabilir.

Ve son, çok önemli olmayan bir soru, anlık frekanslar hakkında bulduğum çoğu makalenin, özellikle deprem gibi sismografik olayların hesaplanmasında coğrafya alanından olması neden. Barne'nin makalesi de bunu örnek alıyor. Anlık frekans birçok alanda ilginç değil mi?

Şimdiye kadar, her cevap için çok minnettarım, özellikle birisi bana gerçek bir yazılım projesinde nasıl uygulanacağı konusunda ipuçları verdiğinde ;)

Saygılarımla, Patrick

Yanıtlar:


4

Gerçekten bir cevap değil, belki de yardımcı olabilir: Şahsen, anlık frekans kavramının sadece yeterince dar bant sinyalleri için yararlı olduğunu buldum.

100Hz ve 934Hz gibi iki sabit sinüs dalgasının basit örneğini düşünün. Bu durumda, anlık frekansı (istediğiniz şekilde) kesinlikle tanımlayabilir ve hesaplayabilirsiniz, ancak sonuç ne olmalıdır? Anlık frekans, sinyal hakkında anlamlı bir şey söyleyen olası içgörü veya özelliklere sahip olabilir mi? Anlık frekans kavramını aynı anda birden fazla frekansa sahip sinyallere uygulamak, çok mantıklı değildir.

Bu yüzden taramalar için iyi sonuçlar, ancak Sweep + sinüs için garip eğriler elde edersiniz. Ayrıca, kıkırdamaları, süpürmenin yüksek bir parçası olarak görmenizin nedeni de budur. Sinyalin bant genişliği, ona tek bir frekans numarası atamak için çok yüksek olur ve sonuçlar artar.


Şimdiye kadar ipucu için teşekkür ederiz ve bu yorum iyi bir noktaya düşünüyorum. Ama sonra merak ediyorum, "saf cıvıltı sinyalinin" anlık fazının hesaplanması neden 20Hz'nin üzerinde sorun yaşıyor. Hala belirlenecek tek bir frekans var, mevcut.
muuh

// anlık frekans kavramı sadece yeterince dar bant sinyalleri için kullanışlıdır. / / ------ evet, tek bir AM'd ve FM'd sinüzoid gibi.
robert bristow-johnson

4

En azından f2 ve f3, saf bir cıvıltı sinyali üzerinde uygun çalışıyor gibi görünüyor, ancak sinyalde birden fazla frekans söz konusu olduğunda, f2 ve f3 dahil olmak üzere tüm yöntemler korkunç başarısız görünüyor. Gerçekte bir sinyalde birden fazla frekans olması her zaman böyledir. Peki kişi (daha fazla veya daha az) doğru anlık frekansı nasıl alabilir?

Hilmar'ın önerdiği gibi, Hilbert dönüşümü (veya "Analitik Sinyal") yöntemi birden fazla frekans bileşeni olduğu için geniş bantta çalışmaz. bu yöntemi yalnızca tek bir sinüzoidal bileşen için yapabilirsiniz.

Analitik Sinyal yaklaşımı ile yapmak istediğiniz şey bu kimliği kullanmaktır:

arctanu-arctanv=arctan(u-v1+uv)

Eğer |u-v| Barner'ın türetilebileceği kadar küçük. "f9"formülünden.

ancak bunu yapmak için Hilbert dönüşüm hesaplamasında yalnızca bir kez değişen sinüzoid olması gerekir. ve "in-phase" bileşenini Hilbert dönüşümünün çıktısıyla (nedensel FIR filtresiyle ertelenir) daha iyi hizalarsınız. aksi halde bok alırsınız.


1

Vay, ne büyük bir soru. Önce çok önemli olmayan soruya cevap vereceğim:

Ve son, çok önemli olmayan bir soru, anlık frekanslar hakkında bulduğum çoğu makalenin, özellikle deprem gibi sismografik olayların hesaplanmasında coğrafya alanından olması neden. Barne'nin makalesi de bunu örnek alıyor. Anlık frekans birçok alanda ilginç değil mi?

Bunun nedeni, sismografik sistemin "vibroseis" in petrol endüstrisinde sismik araştırmalar yapmak için kullanılmasıdır. Bağladığım kamyonlar yaklaşık 5 Hz'den 90 Hz'ye kadar titreşiyor ve cıvıltı sinyalleri yapmak için üretilebiliyor. Petrol endüstrisinde çok para var ve bu sinyallerin getirilerini işlemek çok, çok kazançlı olabilir. Bu nedenle, birçok kişi, anlık frekans tekniklerine bakmak da dahil olmak üzere bu sinyalleri analiz etmek için uzun saatler harcadı.


Daha önemli sorularınıza gelince: genellikle, aritmetik farklar yapmak ve ayrık zamanlı sinyaller üzerinde arktangtanları hesaplamak Kötü Bir ŞeydirTM. Bunun nedeni, ayrık zamanlı frekans tahminlerinin "dairesel aritmetik" (AKA vektör aritmetiği) kullanılarak hesaplanması gerektiğidir.

Bu makaleye göz atın.

Daha iyi yaklaşımlar, burada uygulandığı şekliyle "faz ağırlıklı ortalamaları" kullanma eğilimindedir . Ya da matlab'a doğrudan bağlantı için .


1

Gerçeklerden bir yıl sonra cevap verdiğim için üzgünüm, ama bu konuyla ilgili makaleler ararken bu gönderiyle karşılaştım. Sorularınız, başlangıcından bu yana alanı rahatsız eden “anlık frekans” ın yaygın anlaşmazlıklarını ve yorumlarını yansıtıyor. Buradaki bazı cevaplar olarak IF'nin yalnızca "dar bant" veya "tek bileşenli" sinyaller için geçerli olduğunu birçok kişi size söyleyecektir. Aslında, bu doğru değildir: bazen Hilbert dönüşümü tarafından elde edilen IF, geniş bant ve / veya "çok bileşenli" sinyaller için mükemmel şekilde davranır. Bu zorlukların çoğundan kaçınan bir miktar, bir spektrogram kullanılarak ölçülebilen "ağırlıklı ortalama anlık frekans (WAIF)" dır.

Bkz. J. Acoust. Soc. Am., Ocak 1999. IF ile ilgili diğer iyi makaleler ve yaygın yanılgılar Picinbono (IEEE Trans. Sig. Proc., Mart 1997) ve Vakman (IEEE Trans. Sig. Proc., Nisan 1996).

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.