2013-10-18 5 views
2

파이썬에서 2D FFT를 할 때 정규화에 관한 간단한 질문이 있습니다. 정상적인 요소는 1로 채워지는 배열로부터 결정될 수 있습니다.2D FFT의 정규화

예를 들어 1d에서 [1,1,1,1]의 FFT는 [4 + 0j, 0 + 0j, 0 + 0j, 0 + 0j]를 제공하므로 정규화 인수는 1/N = 1/4.

2D에서 [[1,1], [1,1]]의 FFT는 [[4 + 0j, 0 + 0j], [0 + 0j, 0 + 0j] 1/MN = 1/(2 * 2) = 1/4가된다.

이제 각 요소의 평균 분포가 가우스 분포 인 3000 x 3000 매트릭스가 있다고 가정합니다. 정규화 인수 = 1/(3000 * 3000)를 FFT하여 정규화하면 10^-7의 순서.

이제 우리는 반복이 1000 1000에 의해 소자 영역 부 이용 (정규화 계수 = 1 * 1000/(1000)). 우리가 얻는 평균 전력은 10^-6입니다. 나는 ~ 10의 차이가있는 이유가 궁금합니다. 평균의 힘이 같지 않아야합니까? 여분의 정규화 요소가 누락 되었습니까?

요소 차이가 실제로 9 인 경우, 요소 수 (3000 x 3000의 요소 수가 1000 x 1000보다 9 배 더 많음)에서 추측 할 수 있지만이 직관적 인 이유는 무엇입니까? 여분의 요인? 또한 "진정한"기본 평균 전력을 얻기 위해 절대 표준화 계수를 어떻게 결정합니까?

는 모든 통찰력이 크게 감사합니다. 미리 감사드립니다!

샘플 코드 :

import numpy as np 
a = np.random.randn(3000,3000) 
af = np.fft.fft2(a)/3000.0/3000.0 
aP = np.mean(np.abs(af)**2) 

b = a[1000:2000,1000:2000] 
bf = np.fft.fft2(b)/1000.0/1000.0 
bP = np.mean(np.abs(bf)**2) 

print aP,bP 

>1.11094908545e-07 1.00226264535e-06 
+0

FFT는 평균화 과정이기 때문에 양자화를 기반으로 보정해야한다고 생각합니다. 20.log (3,10) = 9.54 : 귀하의 요소가 여기에 있습니다. 기타 : http://www.lumerink.com/courses/ece697/docs/Papers/The%20Fundamentals%20of%20FFT-Based%20Signal%20Analysis%20and%20Measurements.pdf – lucasg

답변

2

첫째,이 문제는 1D 및 2D FFT를 사이의 차이와 관련이없는 점에 유의하는 것이 중요하지만, 오히려 어떻게 전체 전력 및 요소의 수와 전력 규모를 의미하는 배열로.

9의 인수가 a의 9x 더 많은 요소에서 온다고 말하면 정확하게 맞습니다. b입니다. 무엇, 혼란 것은 아마도 당신은 이미 사실 np.fft.fft2(a)/3000./3000.np.fft.fft2(b)/1000./1000.로 나누어 정규화 한 것으로 나타났습니다이다, 그 정상화는 전원이 공간 및 주파수 도메인에서 동일하게 (의미 없음) 총을 얻을 필요합니다. 평균을 얻으려면 배열 크기로 다시 나누어야합니다.

귀하의 질문은 두 도메인 (공간/시간 및 주파수)의 총 전력이 동일하다고 주장한다 Parseval의 정리, 정말입니다. DFT에 대한 진술은 this입니다. 공지 사항, 즉 오른쪽의 1/N에도 불구하고,이 평균 전력,하지만 전력이 아니다. 1/N의 이유는 DFT에 대한 정규화 규칙입니다. 다음은 np.sum(np.abs(sig)**2) == np.sum(np.abs(np.fft.fft(sig))**2)/sig.size

일부 장난감의 경우 (하나, 둘,로 시작, 완벽한 예입니다 파이썬에 넣어

,이 같은 시간/공간 신호 sig에 대한 Parseval 등가가 언급 될 수 있음을 의미 2 차원 배열은 1을 채웠다.) 그리고 당신 자신의 경우로 끝난다. numpy.ndarray의 .size 속성을 사용하여 배열의 총 요소 수를 반환합니다. 너의 /1000./1000. 등등과 동등한 희망. 이것은 희망한다!

import numpy as np 

print 'simple examples:' 

# 1-d, 4 elements: 
ones_1d = np.array([1.,1.,1.,1.]) 
ones_1d_f = np.fft.fft(ones_1d) 

# compute total power in space and frequency domains: 
space_power_1d = np.sum(np.abs(ones_1d)**2) 
freq_power_1d = np.sum(np.abs(ones_1d_f)**2)/ones_1d.size 
print 'space_power_1d = %f'%space_power_1d 
print 'freq_power_1d = %f'%freq_power_1d 

# 2-d, 4 elements: 
ones_2d = np.array([[1.,1.],[1.,1.]]) 
ones_2d_f = np.fft.fft2(ones_2d) 

# compute and print total power in space and frequency domains: 
space_power_2d = np.sum(np.abs(ones_2d)**2) 
freq_power_2d = np.sum(np.abs(ones_2d_f)**2)/ones_2d.size 
print 'space_power_2d = %f'%space_power_2d 
print 'freq_power_2d = %f'%freq_power_2d 

# 2-d, 9 elements: 
ones_2d_big = np.array([[1.,1.,1.],[1.,1.,1.],[1.,1.,1.]]) 
ones_2d_big_f = np.fft.fft2(ones_2d_big) 

# compute and print total power in space and frequency domains: 
space_power_2d_big = np.sum(np.abs(ones_2d_big)**2) 
freq_power_2d_big = np.sum(np.abs(ones_2d_big_f)**2)/ones_2d_big.size 
print 'space_power_2d_big = %f'%space_power_2d_big 
print 'freq_power_2d_big = %f'%freq_power_2d_big 
print 


# asker's example array a and fft af: 
print 'askers examples:' 
a = np.random.randn(3000,3000) 
af = np.fft.fft2(a) 

# compute the space and frequency total powers: 
space_power_a = np.sum(np.abs(a)**2) 
freq_power_a = np.sum(np.abs(af)**2)/af.size 

# mean power is the total power divided by the array size: 
freq_power_a_mean = freq_power_a/af.size 

print 'space_power_a = %f'%space_power_a 
print 'freq_power_a = %f'%freq_power_a 
print 'freq_power_a_mean = %f'%freq_power_a_mean 
print 
# the central 1000x1000 section of the 3000x3000 original array: 
b = a[1000:2000,1000:2000] 
bf = np.fft.fft2(b) 

# we expect the total power in the space and frequency domains 
# to be about 1/9 of the total power in the space frequency domains 
# for matrix a: 
space_power_b = np.sum(np.abs(b)**2) 
freq_power_b = np.sum(np.abs(bf)**2)/bf.size 
# we expect the mean power to be the same as the mean power from 
# matrix a: 
freq_power_b_mean = freq_power_b/bf.size 

print 'space_power_b = %f'%space_power_b 
print 'freq_power_b = %f'%freq_power_b 
print 'freq_power_b_mean = %f'%freq_power_b_mean