2013-03-07 4 views
13

센서의 데이터가 있으며 주파수를 찾아야합니다. fft() 가야 할 것 같지만 MATLAB 문서는 주파수 그래프를 얻는 방법 만 보여줍니다. 거기에서 무엇을해야할지 모르겠습니다.MATLAB의 신호 데이터에서 주파수 결정

여기 내 데이터의 모습입니다 : 갈

enter image description here

답변

18

한 가지 방법은 FFT를 사용하는 참이다. fft는 신호의 주파수 표현을 제공하기 때문에 최대를 찾고 fft는 복소 신호이므로 절대 값을 먼저 가져야합니다. 지수는 최대 에너지를 갖는 정규화 된 주파수에 해당합니다. 마지막으로, 신호에 오프셋이있는 경우, 표시된 것과 마찬가지로 오프셋을 없애고 fft를 취하여 DC 구성 요소를 나타내는 원점에서 최대 값을 얻지 못하게하려고합니다. 나는 것 한 줄에 넣어 기술 된

모든 : indexMax는 최대 FFT 값을 찾을 수있는 지표입니다

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

.

참고 : indexMax에서 실제 관심 주파수까지 얻으려면 fft 길이 (신호 길이와 동일)와 샘플링 빈도 Fs를 알아야합니다. 신호 주파수는 것입니다 :

frequency = indexMax * Fs/L; 

는 다른 방법으로, 신속하고 당신이 가지고있는 신호에 따라도 꽤 잘 작동하여 신호의 자기 상관 걸릴 :

autocorrelation = xcorr(signal); 

을 첫 번째 최대 이후에 발생 찾기 자기 상관의 중심점 (자기 상관은 중간에서 최대 값과 대칭을 이룹니다.) 최대 값을 구함으로써, 이동 된 신호가 더 많이 또는 더 적은 것처럼 보이는 첫 번째 위치를 찾을 수 있습니다. 나는. 당신은 당신의 신호의 기간을 발견 할 수 있습니다. 그주기의 배수만큼 쉬프트 된 시그널은 항상 그 자체처럼 보일 것이기 때문에, 여러분이 찾는 최대 값이 시그널의주기에 해당하고 배수 중 하나에 해당하지 않는지 확인해야합니다.

신호의 노이즈로 인해 절대 최대는 기간 자체 대신 여러 기간에 발생할 수 있습니다. 그 잡음을 설명하기 위해서 자기 상관의 절대 값 (자기 상관 (길이) (autocorrelation)/2 + 1)을 취한 다음, 자기 상관이 첫 번째 값의 최대 값의 95 % 95 %, 99 % 또는 다른 숫자는 잡음이 신호를 손상시키는 정도에 따라 달라집니다.

업데이트 : 신호의 "주파수"를 의미한다고 생각합니다. 피치 또는 기본 고조파 또는 가장 많은 에너지를 가진 주파수를 볼 수 있습니다. 주파수로 신호의 주파수 표현을 의미한다면, 첫 번째 근사값으로, FFT의 abs를 플롯하여 에너지가 어디인지에 대한 아이디어 :

plot(abs(fft)); 

복근이있는 이유 또는 fft의 위상을 나타내지 않아서 잃어버린 관련 정보를 알고 싶다면 DFT 변형에 대해 더 자세히 읽고 싶을 것입니다.

+0

내가 가진 신호는 스트레인 게이지를 사용하여 측정 된 일부 진동에서 나온 것입니다. 나는 진동의 빈도를 찾고 싶다. 여러분이 올린'fft' 메쏘드를 사용하면 빈도수는 0.0357이되지만, 음모를 보면 초당 약 10 사이클이되므로 빈도수가 약 10 개가되지 않아야합니까? – edc1591

+0

초당 10 번의 진동이있는 경우 실제로는 0.1 초 또는 10Hz의 주파수입니다. indexMax, L 및 Fs의 값은 무엇입니까? 또한 플롯 (abs (fft))을 실행하여 커다란 스파이크가 있는지 확인하고 indexMax가 스파이크 발생 위치에 대한 올바른 색인인지 확인하십시오. 그래프에서 네거티브 오프셋이 신호에 있음을 알 수 있습니다. 즉, DC 구성 요소를 나타내는 fft에 0에 가까운 스파이크가있게됩니다. 그것은 당신이 측정하고있는 것일 수 있습니다. 이 경우 해당 DC 구성 요소를 제거하려면 대신 fft (신호 - 평균 (신호))를 취하십시오. – Lolo

+0

내가 얻고있는 스파이크는 0 (indexMax = 1)입니다. 나는 당신이 평균 (신호)을 빼서 말했던 것을했는데, 지금 나는 주파수에 대해 약 9.8 Hz를 얻고 있습니다. 도와 줘서 고마워 !! – edc1591

0

는 I는

(indexMax-1) * Fs/L 

절대치의 첫 번째 요소 (FFT (X)), 직류 (DC), 또는 바이어스 신호이거나, 또는 X0의 의미한다고 생각. 우리는 두 번째 요소 (X1)에서부터 계산합니다. 내가 잘못했는지 알려주세요. 감사. 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 
관련 문제