2014-12-01 2 views
1

많은 연구와 과제를 읽은 후에도 가속도계 데이터에 FFT를 적용하는 데 문제가 있습니다. 내 코드의 대부분은 공식 MATLAB 예제에서 가져온 것입니다 : FFT for one dimension. 더 많은 책을 읽고 난 후에이 질문을 발견했습니다 : FFT and accelerometer data: why am I getting this output? 거기에 윈도우 잉을 사용할 것을 제안했습니다. 그래서 더 많은 책을 읽고 나면 코드에 해밍 창을 추가했습니다.FFT가있는 가속도계 - 이상한 출력

내 데이터를 음모에 그 다음과 같습니다 enter image description here

을 그리고 이것은 내가 FFT를 위해 사용하고있는 코드입니다 :

fs = 1/0.02; %0.02 comes from picking sample each 20ms 
m = size(data,1); 
w = hanning(m); 
yw = w.*data; 
n = pow2(nextpow2(yw)); 
y = fft(yw,size(n,1)); 
f = (0:size(n,1)-1)*(fs/size(n,1)); 
power = y.*conj(y)/size(n,1); 
figure 
plot(f,power) 

문제는이 코드에서 내 음모처럼 보이는 것입니다 : enter image description here

누군가 내 코드에 어떤 문제가 있다고 말할 수 있습니까? 솔직히 말해서 나는 그것이 더 좋아 보일 것 (이것은 다음과 같은 것 : http://imgur.com/wGs43)을 제외시켰다. 그래서 나는이 질문을하고있다.

편집 : 내 데이터를 여기에서 찾을 수 있습니다 : https://dl.dropboxusercontent.com/u/58774274/exp.txt

+0

'n = pow2 (nextpow2 (length (yw)));'및'fft (yw, n)'을 변경하면 개선이 있는지 확인하십시오. – Rashid

+0

'f'도 문제가 있습니다. 데이터를 공유 할 수 있다면 도움이 될 것입니다. – Rashid

+0

@Kamtal 주어진 선을 변경해도 개선되지 않았습니다. 플롯이 비어있었습니다 (축이 표시됨). 내 데이터를 추가했습니다. – sebap123

답변

2

귀하의 Fs50 그래서 데이터에서 가장 높은 주파수 Fs/2 = 25Hz 될 수 있습니다.

이 코드가 도움이되는지 확인하십시오.

fid = fopen('1.txt','r'); 
C = textscan(fid, '%f'); 
fclose(fid); 
data = C{1}; 
fs = 50; 
m = length(data); 
nfft = 2^nextpow2(m); 
y = fft(data,nfft)/m; 
f = fs/2 * linspace(0,1,nfft/2+1); 
power = abs(y); 
subplot(211) 
plot(f,power(1:nfft/2+1)) 
t = (0 : m-1)/fs; 
s0 = .8*fs : 3.2*fs; % .8 sec to 3.2 sec 
p(s0) = .5*cos(2*pi*3.3*t(s0)+.25*pi); 
p = p + mean(data); 
subplot(212) 
plot(t,data);hold on 
plot(t,p,'r') 

enter image description here

이 주파수 영역에서 데이터입니다

.

3.3 Hz에 최고점이 있습니다. 당신이 볼 수 있듯이 나는 당신의 데이터와 함께 3.3 Hz의 주파수를 가진 정현파를 꾸몄다 증명으로

,

, 그것은 완전히 데이터를 일치합니다.

+0

이 코드 결과는 다음과 같습니다. http://imgur.com/Mwk1GFx 그래서 올바른 것은 아닙니다. – sebap123

+0

편집 후 : http://imgur.com/GuN8UUE – sebap123

+0

http://imgur.com/GuN8UUE – sebap123

1

기준 플롯이 보여주는 것은 로그 눈금의 크기 (dB)입니다. 또한 DC 오프셋이 제거 된 것 같습니다. 그래서 코드에 적용하면 이런 식으로 끝납니다.

data = data-mean(data); % DC removal 
fs = 50; 
m = length(data); 
nfft = 2^nextpow2(m); 
y = fft(data,nfft)/m; 
f = fs/2 * linspace(0,1,nfft/2+1); 
power = abs(y); 
plot(f,10*log10(power(1:nfft/2+1))); % plot log magnitude 
ylim([-30 0]) %limit axis 

저에게 적어도 비슷하게 보입니다.

enter image description here

당신이 추가로 당신은 기본적 신호의 전력 스펙트럼 밀도를 추정하는 절대 광장을합니다. 즉, power = abs(y);power = abs(y.^2);으로 변경해야하며, 분명히 ylim([-30 0])을 -50과 같이 낮은 값으로 조정해야합니다.

2

DC 오프셋을 먼저 제거한 다음 (FFT를 계산하기 전에 각 포인트의 모든 샘플의 평균을 뺀) FFT 결과 데이터 포인트의 절반 만 표시하거나 (N/2) FFT 결과의 상반부는 실제 데이터 입력을위한 상반의 공액 거울이기 때문에).