MATLAB

2013-03-07 21 views
13

içindeki sinyal verisinden kaynaklanan frekansı belirleme Bir sensörden veri aldım ve frekansını bulmalıyım. Görünüşe göre, fft() gibi görünüyor, ancak MATLAB dokümanları sadece frekansların bir grafiğini nasıl göstereceklerini gösteriyor, oradan ne yapacağımı bilmiyorum.MATLAB

İşte benim veri gibi görünüyor: gitmek

enter image description here

cevap

18

bir yolu bir fft kullanmak gerçekten de öyle. Fft, sinyalin frekans gösterimini sağladığından, maksimumı aramak istersiniz ve fft karmaşık bir sinyal olduğundan, önce mutlak değeri almak isteyeceksiniz. Endeks maksimum enerjiyle normalize frekansa karşılık gelecektir. Son olarak, eğer sinyaliniz bir ofsete sahipse, gösterdiğiniz ile olduğu gibi, fft'yi almadan önce bu ofsetden kurtulmak istersiniz, böylece DC bileşenini temsil eden bir menzil elde edemezsiniz. Ben olurdu bir satırda koymak açıklanan

Herşey: indexMax max FFT değeri bulunabilir endeksi ise

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

. Not: indexMax öğesinden ilgili gerçek frekansa geçmek için, fft'in L uzunluğunu (sinyalin uzunluğu ile aynı) ve örnekleme frekansını (Fs) bilmeniz gerekir. Sinyal frekansı sonra olacak:

frequency = indexMax * Fs/L; 

Alternatif olarak, daha hızlı ve sahip sinyale bağlı olarak da oldukça iyi çalışıyor, senin sinyalin otokorelasyonunu atın:

autocorrelation = xcorr(signal); 

ve birinci maksimum sonrasında ortaya bulmak Otokorelasyonun merkez noktası. (Otokorelasyon, maksimum ortasındaki simetrik olacaktır.) En yüksek değeri bularak, kaymış sinyalin kendisinin daha çok ya da daha az göründüğü ilk yeri bulursunuz. Yani sinyalinin periyodunu bulursun. Döngünün bir katı tarafından değiştirilen sinyal her zaman kendi gibi görüneceğinden, bulduğunuz maksimum değerin sinyalin süresine karşılık geldiğinden ve katlarından biri olmadığından emin olmalısınız.

Sinyalinizdeki parazit nedeniyle, mutlak maksimum, periyodun kendisinin değil, döneminizin çoğunda meydana gelebilir. Bu gürültüyü hesaba katabilmek için, otokorelasyonun mutlak maksimumunu (otokorelasyon (uzunluk (otokorelasyon)/2 + 1) alırsınız ve daha sonra otokorelasyonun, ilk önce bu maksimum değerin% 95'inden daha büyük olduğunu bulursunuz. sinyalin ikinci yarısında geçen süre% 95,% 99 veya başka bir sayı, ne kadar gürültünün sinyalinizi bozduğuna bağlıdır.

GÜNCELLEME: Sinyalinizin "frekansı" ile kastettiğinizi varsaydığımı fark ettim. en enerji ile zift veya baz harmonik veya frekans, ancak bakmak istiyorum.Frekansla, sinyalin frekans gösterimi anlamına geldiyse, daha sonra bir ilk yaklaşım için, sadece bir FFT'nin absini çizmek için Enerjinin nerede olduğu fikri:

Bir abs'in neden olduğunu anlamak veya fft'in fazını temsil etmeyerek hangi bilgileri kaybettiğinizi anlamak istiyorsanız, tam olarak ne aldığınızı anlamak için DFT dönüşümü hakkında biraz daha fazla bilgi edinmek isteyebilirsiniz.

+0

sinyali bir gerilme ölçer kullanılarak ölçülen bir salınımlar arasındadır. Bu salınımların sıklığını bulmak istiyorum. Gönderdiğiniz 'fft' yöntemini kullanarak, frekans için 0,0357 aldım, ancak arsaya bakarak, saniyede yaklaşık 10 döngü var, bu yüzden frekans için yaklaşık 10 almamalı mıyım? – edc1591

+0

Saniyede 10 salınım varsa, bu bir .1s veya 10 Hz frekansıdır. IndexMax, L ve Fs için değerler nelerdir? Ayrıca büyük bir başak olduğunu doğrulamak için arsa (abs (fft)) çalıştırın ve bu başak nerede meydana geldiği için indexMax doğru dizin. Grafikte, sinyalinizde negatif bir sapma olduğunu gösterdiğinizi görüyorum, yani DC bileşenini temsil eden fft'iniz için sıfıra yakın bir artış olacak. Ölçtüğünüz şey bu olabilir. Eğer durum buysa, o DC bileşenini kaldırmak yerine fft (sinyal-ortalama (sinyal)) alın. – Lolo

+0

Aldığım artış sıfırdaydı (indexMax = 1). Ne demek istedim dediğimi (sinyal) çıkararak yaptım ve şimdi frekans için yaklaşık 9.8 Hz elde ediyorum, bu doğru görünüyor! Yardım için çok teşekkürler! – edc1591

0

Ben

(indexMax-1) * Fs/L 

abs ilk öğesi (fft (x)) doğru akım (DC), ya da önyargı, olabilir ya sinyal ya X0'ın anlamına gerektiğini düşünüyorum. İkinci elementten (X1) saydık. Lütfen yanılıyorsam bildirin. Teşekkürler. Ben enter image description here

clear all 
clc 
close all 
Fs = 1; 
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal 
t = 0:Fs:T; % T seconds 
L = length(t); % L is the length of sample sequence 
bias = 4 
signal = sin(t) + bias; 

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

frequency_method1 = (indexMax-1) * Fs/(L-1); 
frequency_method2 = (indexMax-1) * Fs/L; 


number_of_cycles_method1 = frequency_method1*T 

number_of_cycles_method2 = frequency_method2*T 


subplot(2,1,1) 
plot(t,signal,'-or') ; grid on; 
legend('about 1.7 cycles of cosine signal') 
subplot(2,1,2) 
plot(abs(fft(signal-mean(signal))),'-xb'); grid on 
legend('abs of fft') 

number_of_cycles_method1 = 

    2 


number_of_cycles_method2 = 

    1.8333