2016-11-08 1 views
0

신호의 파워 스펙트럼을 찾으려고합니다. 신호의 길이는 100000이고, 샘플 주파수는 1000Hz이며, 포인트 수는 100000입니다. 나는 두 가지 접근법을 사용하여 파워 스펙트럼을 발견했다. 첫 번째 방법은 모든 길이를 하나의 파트로 가져와 두 번째 방법은 신호를 100*1000으로 나누고 각 행의 스펙트럼을 찾아 모든 행의 평균을 구하는 방법입니다. 내 문제는 두 가지 접근 방식 모두에서 동일한 대답을 얻어야하지만 다른 대답이 있다는 것입니다. 내 코드에서 오류가 무엇인지 모르겠다.두 가지 접근 방법을 사용하여 신호의 파워 스펙트럼을 찾습니다.

N=100000; 
SF=1000;  
a=0.1; 
b=0.3; 
amplitude1=1; 
amplitude2=0.5; 
t=0:1/SF:100; 
f1=SF*a; 
f2=SF*b; 
A=amplitude1*sin(2*pi*f1*t)+amplitude2*sin(2*pi*f2*t); 
Y=2*randn(1,length(A))+A; 
bin=[0 :N/2]; 
fax_Hz=(bin*SF)/N; 
FFT=fft(Y); 
spectra=2/(SF*length(Y))*(FFT.*conj(FFT)); 
plot(fax_Hz,spectra(1,1:50001)); 
D=reshape(Y(1,1:100000),[100,1000]); 
M=length(D(1,:)); 
for i=1:100 
    FFT_1(i,:)=fft(D(i,:)); 
    S(i,:)=(2/(SF*M))*(FFT_1(i,:).*conj(FFT_1(i,:))); 
end 
S_f=mean(S); 
figure 
plot (S_f); 

방금 ​​코드를 업데이트합니다. 모르겠지만 신호를 보내면 두 개의 플롯이 바뀌어 보인다.

답변

1

reshape의 주된 문제점은 각 행이 별도의 순서로 작업하고 있다는 것입니다. 그러나 Reshape는 두 번째 열로 이동하기 전에 첫 번째 열을 채 웁니다.

대신 다음을 사용할 수 있습니다.

D=reshape(A(1,1:100000),[1000,100]).'; 

정규화가 또 다른 문제입니다. 기본값으로 정규화되어 있으므로 fft 대신 ifft을 사용할 수 있습니다 (이유는 확실하지 않음). 또는 정규화를 유지하고 mean을 사용하는 대신 sum을 사용해야합니다. 실수로 인한 것일 수 있습니다. 진폭에는 여전히 작은 불일치가있는 것 같습니다. 어디에서 오는지 확실하지 않습니다. 끝에

는 다음을 사용 플롯 :

bin=[0 :N]; 
fax_Hz=(bin*SF)/N; 
FFT=ifft(A); 
spectra=FFT.*conj(FFT); 
plot(fax_Hz,spectra); hold on 
D=reshape(A(1,1:100000),[1000,100]).'; 
M=length(D(1,:)); 
for i=1:100 
    FFT_1(i,:)=ifft(D(i,:)); 
    S(i,:)=FFT_1(i,:).*conj(FFT_1(i,:)); 
end 
S_f=mean(S); 
plot(fax_Hz(1:100:end-1), S_f); 

참고하십시오 fax_Hz(1:100:end-1)가 동일하게 벡터의 길이를 얻기의 해키 방법입니다.

+0

도움 주셔서 감사합니다. 제발, 나도 몰라요. 그러나 신호에 노이즈를 추가했을 때 두 개의 플롯이 바뀌 었습니다. 코드를 업데이트하면됩니다. – user6052232

+0

그 문제를 재현 할 수 없습니다. 귀하의 코드에서 아래의 'bin'에있는 모든 것을 제거하고 내가 게시 한 코드로 대체하십시오. (분명히 'A'를 'Y'로 바꾼다) – mpaskov

관련 문제