2016-07-18 2 views
1

제발, F(8*409600*3) 행렬이 있습니다. 나는 B(8*512*3*800) 행렬 (각각의 행은 800 부분으로 나눠야 함)로 바꾼다. 그리고 나서 (FFT)을 개의 행으로 변환하고 그것을 켤레로 곱하고 상수로 나눈 다음에 요소의 합계를 구해야한다. 제 4 차원의 각 행의 수와 제 4 차원 (800) 내의 슬라이스의 수로 평균화한다. 내 말은4D 행렬에서 FFT 및 합계 찾기

(B(1,1,1,1) +B(1,1,1,2)+B(1,1,1,3)……+B(1,1,1,800))/800 
(B(1,2,1,1) +B(1,2,1,2)+B(1,2,1,3)……+B(1,2,1,800))/800 

등 각 행에 대해서도 마찬가지입니다.

아래 코드를 사용하면 올바르게 작동하지만 올바른 결과를 얻지 못합니다.

F=rand(8,409600,3); 
B=reshape(F,8,512,3,[]); 
C1=fft(B, [],2); 
C2=C1.*conj(C1); 
C3=C2/(3000); 
C4=sum(C3,4)/800; 

덕분에

+0

(1) 입력 데이터가 무작위 인 경우 올바른 결과가 아님을 어떻게 알 수 있습니까? 'C4'가 잘못된 크기입니까? (2) B는 4 차원이다. 3 차원에서 1D FFT를, 3 차원 및 4 차원에서 2D FFT를 사용 하시겠습니까? (귀하의 코드는 길이가 512 요소 인 * 초 * 차원을 따라 1D FFT를 사용합니다.) (3)'F'의 두 번째 차원의 길이는 409600 = 512 * 800입니다. 그러나 그 '재구성'은 409600 개의 요소를 함께 유지하지 않을 것입니다 : B의 ​​3 차원 (길이 3)은 512와 800 사이입니다. 정말로 원하는 것입니까? –

+0

위의 (3)에 대해서 : 단순화 된 2D 예제를 생각해 보자 :'F = [1:10; 101 : 110; 1001 : 1010]. 'F ='는 10 x 3이며, 0에서 100까지 1000에서 시작하여 1부터 10까지를 포함합니다.'B1 = reshape (F, 5, 2, []))'를 수행하면 길이 10의 첫 번째 차원은 B와 B의 첫 번째 페이지는 '1 : 5'가 될 것이며, 더 중요하게는 두 개의 차원으로 나뉘어집니다. '6 : 10'을 두 개의 열로 나타냅니다. * 그러나 *,'B2 = reshape (F, 5, [], 2)'는 매우 다른 것을 할 것이고'B2'는'F'의 세개의 컬럼을 혼합 할 것입니다. 네가 그걸 원하는지 확신 할 수 없어. –

+0

@Ahmed Fasih, 감사합니다.그 결과에 대한 음모가 있는데 그것이 맞지 않다는 것을 알았습니다. 실제 데이터를 가지고 있지만 이것은 단지 예일뿐입니다. 원래 데이터는 8 * 409600 * 3이고 PSD (power spectral density)의 평균을 구해야합니다. 그리고 그것을하기 위해, 나는 800 부분으로 (8 * 409600)를 깨야 만한다. 각 부분은 512 점을 가진다. 그 후, 나는 각 512 포인트에 대해 FFT를 찾아 공액으로 곱하고 여기에있는 상수 (나눗셈 * 주파수 해상도)로 나눈 다음 512 포인트를 가진 한 행에 대해 PSD를 얻습니다. – user6052232

답변

1

나는 당신이 3 배열로 800 (512) (8)을 얻을 수 B = reshape(F, 8, 512, [], 3);을 시도하려는 생각합니다.

그런 다음 C1 = abs(fft(B, [], 2)).^2;을 수행하여 512 포인트 FFT를 취한 다음 스펙트럼을 파워 스펙트럼으로 변환하십시오. 복잡한 c의 경우 기계 정밀도에 conj(c) * c == abs(c)^2을 입력하십시오.

그런 다음이 800 개의 512 포인트 PSD (평균 : C2 = squeeze(mean(C1, 3));)를 원합니다. 여기서 squeeze을 사용하지 않으면 8x5x1x3 배열을 가지며 squeeze은 길이가 1 인 차원을 제거하여 C2은 8 x 512 x 3 배열로 남겨 둡니다. 나는 여기에 sum과 divide 대신에 mean을 사용하는 것을 선호한다. 왜냐하면 그것은 당신이 성취하고자하는 것이 더 분명하기 때문이다.

마지막으로 3000 요소가있는 것 같습니다 (C3 = C2/3000;).


다음은 내가 당신의 문제에 대해 어떻게 생각하고 있는지를 나타낸 것입니다. 8 개의 센서 (마이크, 포토 다이오드 등)가 있습니다. 각 센서는 409600 개의 샘플을 수집합니다. 너는 3 일 동안 이것을한다. 따라서 원래의 F 행렬은 8 x 4096003입니다.

이제 3 일 동안 각 센서의 전원 스펙트럼 밀도가 어떻게 변하는 지 확인하고자합니다. 따라서 각 센서/하루의 409600 샘플을 800 개의 덩어리로 나눠서 각 덩어리는 512 개의 샘플을 얻습니다. 덩어리 사이에는 겹치지 않습니다. 위의 코드에서 각 512 길이 청크의 FFT를 가져 와서 모두 800 개를 평균화합니다. 이렇게하면 8 x 512 x 3 배열이 생기고 각 센서의 PSD 추정치를 매일 계산할 수 있습니다.

+0

정말 고마워요. 정확히 마이크 (8 개의 마이크가 있음)의 데이터가 있고 각 마이크 (1 * 409600)가 있으며 3 가지 경우에 해당합니다. 그래서 (8 * 409600 * 3). 나는 PSD (각 마이크의 평균 PSD와 위의 절차를 사용하기 위해서)를 찾아야 만한다. – user6052232