2012-09-28 6 views
2

캡처 한 일부 데이터에 대해 FFT를 수행하려고합니다. 나는 10MHz-100MHz 범위에서 작업하고 있으므로, 8192 샘플 캡쳐는 FFT를 수행 할 때 의미있는 것을 전달하기에 충분하지 않을 것입니다. 그래서 나는 사인파의 많은 중첩되지 않는 캡처를 취해서 함께 평균을 내고 싶습니다. 나는 현재 모든 파일의 대한 - 루프 (Scilab에서) 뭘 오전겹치지 않는 블록을 사용하여 FFT 평균을 수행하는 방법

은 다음과 같습니다

temp1 = read_csv(filename,"\t"); 
temp1_fft = fft(temp1); 
temp1_fft = temp1_fft .* conj(temp1_fft); 
temp1_fft = log10(temp1_fft); 
fft_code = fft_code + temp1_fft; 

그리고 나는 모든 파일을 수행하고 때 : fft_code = fft_code./numFiles;

하지만 내가 이것을 올바르게 처리하고 있는지 확신 할 수 없다. 중복되지 않는 샘플을위한 더 좋은 방법이 있습니까?

+0

다음과 같은 몇 가지 사항을 알고 있으면 도움이됩니다. 샘플링 속도, 어떤 데이터 유형인지, 데이터를 전혀 윈도 잉하는 경우 등 – aganders3

답변

0

나는 가까이에 있다고 생각하지만 log10을 복용하기 전에 스펙트럼 크기 (temp1_fft)를 평균화해야합니다. 그렇지 않으면 본질적으로 평균 대신에 곱셈을합니다. 그래서 그 대신, 단지 (내가 scilab 구문을 모르는)과 같이 루프 외부로 log10 이동 :

for filename in files: 
    temp1 = read_csv(filename,"\t"); 
    temp1_fft = fft(temp1); 
    temp1_fft = temp1_fft .* conj(temp1_fft); 
    fft_code = fft_code + temp1_fft; 

fft_code = fft_code./numFiles; 
fft_code = log10(fft_code); 

을 당신은 확실히 당신이 conj 곱하면 당신은 이미이 일을하는 (크기를 사용하려면), 위상 정보는 샘플링이 신호에 상대적으로 시작된시기에 따라 다릅니다. 위상 정보가 필요한 경우 획득이 신호와 어떻게 든 동기화되어 있는지 확인해야합니다. 이것은 무엇을

"Power Spectrum Averaging"라고 :

파워 스펙트럼의 평균화는 RMS 평균화이라고합니다. RMS 평균은 제곱 된 크기의 합계 (FFT 곱하기 복소 공액)의 가중 평균을 계산합니다. 가중치는 선형 또는 지수 중 하나입니다. RMS 평균화는 데이터의 변동을 줄이지 만 실제 노이즈 플로어는 줄이지 ​​않습니다. 충분한 수의 평균을 사용하면 실제 랜덤 노이즈 플로어를 매우 잘 근사 할 수 있습니다. RMS 평균에는 크기 만 포함되므로 RMS 평균의 실수 또는 허수 분의 위상을 표시하는 것은 의미가없고 전력 스펙트럼 평균에는 위상 정보가 없습니다.

+0

Thanks @ aganders3. 그것은 말이되는 것 같습니다. 나는 당신이 제안한 것과 같은 모드를 만들었고 전체적으로 음모는 신호가 1/2만큼 강하다는 것을 제외하면 동일하게 보였다. 변경 전/후에 정규화 된 플롯을보고 있었고 노이즈 플로어는 -12dBc에서 -6dBc로 떨어졌습니다. 제 실수를 고쳤을 때 당신이 기대했던 것은 그게 아닙니까? – toozie21

+0

아마 그런 것 같지만 신호와 잡음 특성에 달려 있습니다. 좀 더 많은 정보 나 예제를 게시하면 좀 더 살펴볼 수 있습니다. 내 제안은 실제로 작업 순서 (평균 및 로그 기록)와 관련이 있습니다. – aganders3