2013-03-07 20 views
13

Mam dane z czujnika i muszę znaleźć częstotliwość. Wygląda na to, że wydaje się, że jest to właściwy sposób, ale dokumentacja MATLAB pokazuje tylko, jak uzyskać wykres częstotliwości, nie wiem, co robić z tego miejsca.Ustalanie częstotliwości z danych sygnału w MATLAB

Oto co moje dane wygląda następująco:

enter image description here

Odpowiedz

18

Jedna droga jest rzeczywiście w użyciu FFT. Ponieważ fft daje częstotliwość reprezentacji sygnału, chcesz szukać maksimum, a ponieważ fft jest złożonym sygnałem, będziesz chciał najpierw przyjąć bezwzględną wartość. Indeks będzie odpowiadał znormalizowanej częstotliwości z maksymalną energią. Na koniec, jeśli twój sygnał ma przesunięcie, tak jak w przypadku tego, który pokazałeś, chcesz pozbyć się tego offsetu przed zrobieniem fft, aby nie uzyskać maksimum w punkcie początkowym reprezentującym komponent DC.

Wszystko opisałem umieścić w jednej linii byłoby:

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

gdzie indexMax jest indeks, gdzie maksymalna wartość FFT można znaleźć.

Uwaga: aby uzyskać z indexMax do rzeczywistej częstotliwości zainteresowania, musisz znać długość L fft (taką samą jak długość sygnału) i częstotliwość próbkowania Fs. Częstotliwość sygnału będzie wtedy:

frequency = indexMax * Fs/L; 

Alternatywnie, szybciej i działa dość dobrze też w zależności od sygnału masz, weź autokorelacji sygnału:

autocorrelation = xcorr(signal); 

i znaleźć pierwsze maksimum występującym po punkt centralny autokorelacji. (Autokorelacja będzie symetryczna z maksimum w środku.) Wykrywając to maksimum, znajdziesz pierwsze miejsce, w którym przesunięty sygnał wygląda mniej więcej tak jak on sam. To znaczy. znajdujesz okres swojego sygnału. Ponieważ sygnał przesunięty o wielokrotność jego okresu zawsze będzie wyglądał jak sam, musisz upewnić się, że maksymalne, jakie znajdujesz, odpowiada rzeczywiście okresowi sygnału, a nie jego wielokrotności.

Z powodu szumu w sygnale, absolutne maksimum może bardzo dobrze występować w wielokrotności okresu, zamiast samego okresu. Aby uwzględnić ten szum, należałoby przyjąć bezwzględną maksimum autokorelacji (autokorelacja (długość (autokorelacja)/2 + 1), a następnie ustalić, gdzie autokorelacja jest większa niż, powiedzmy, 95% tej wartości maksymalnej dla pierwszego czas w drugiej połowie sygnału 95%, 99% lub inna liczba zależy od tego, ile szumu zakłóci twój sygnał

AKTUALIZACJA: Zdaję sobie sprawę, że zakładam, że masz na myśli "częstotliwość" twojego sygnału wysokość lub podstawa harmonicznej lub częstotliwości z największą ilością energii, jednak chcesz na to patrzeć.Jeśli z częstotliwością chodziło Ci o reprezentację częstotliwościową twojego sygnału, to do pierwszego przybliżenia, po prostu chcesz wykreślić abs z FFT, aby uzyskać pomysł, gdzie jest energia:

plot(abs(fft)); 

Jeśli chcesz zrozumieć, dlaczego istnieje abs, lub jakie istotne informacje tracisz, nie reprezentując fazy fft, możesz przeczytać nieco więcej o transformacji DFT, aby dokładnie zrozumieć, co otrzymujesz.

+0

Sygnał że ma wynosi od około oscylacji mierzona za pomocą tensometru. Chcę znaleźć częstotliwość tych oscylacji. Korzystając z opublikowanej przeze mnie metody "fft", otrzymuję 0,0357 dla częstotliwości, ale patrząc na wykres, jest około 10 cykli na sekundę, więc czy nie powinienem dostawać około 10 dla częstotliwości? – edc1591

+0

Jeśli masz 10 oscylacji na sekundę, to jest to okres wynoszący .1s lub częstotliwość 10 Hz. Jakie są wartości dla indexMax, L i Fs? Uruchom również wykres (abs (fft)), aby potwierdzić, że masz duży skok i że indexMax jest poprawnym indeksem dla miejsca, w którym występuje ten szczyt. Zauważam na wykresie, że pokazujesz, że w sygnale jest ujemna wartość przesunięcia, co oznacza, że ​​będzie również skok blisko zera dla twojego fft, który reprezentuje komponent DC. To może być to, co mierzysz. Jeśli tak jest, weź wskaźnik fft (signal-mean (signal)), aby usunąć komponent DC. – Lolo

+0

Kolec, który otrzymywałam, był w zera (indexMax = 1). Zrobiłem to, co powiedziałeś, odejmując średnią (sygnał) i teraz uzyskuję około 9,8 Hz dla częstotliwości, co wydaje się właściwe! Dziękuję bardzo za pomoc !! – edc1591

0

myślę, że powinno być

(indexMax-1) * Fs/L 

Pierwszym elementem abs (fft (x)) jest prąd stały (DC) lub stronniczość lub oznaczać sygnału, albo X0. Liczymy od drugiego elementu (X1). Proszę dać mi znać, jeśli się mylę. Dzięki. 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 
Powiązane problemy