2012-12-10 4 views
0

실제 신호를 리샘플링하고 있습니다. 처분시 fft가 rfft부터이므로 irfft(signal, new_length)을 사용하고 싶습니다. 그러나 나는 그것을 작동시키는 것처럼 보일 수 없다. Numpy/Scipy irfft 이상한 행동

복잡한 FFT를 이용하여 길이 4의 신호를 리샘플링 작동 코드이다

from numpy.fft import fft,ifft 
p=array([1.,2.2,4.,1.]) 
pk=fft(p) 
pnew=ifft(pk,8)*(8./4.) 

여기서 인자 새로운 길이 원본 (8./4.)의 스케일. pnew[::2]==p을 확인할 수 있습니다.

from numpy.fft import rfft,irfft 
p=array([1.,2.2,4.,1.]) 
pk=rfft(p) 
pnew=irfft(pk,8)*(8./4.) 

을 나는 pnew[::2]=[ 1.45, 1.75, 4.45, 0.55]!=p이 : I 변환 실제 푸리에와 같은 전략을 적용 할 때 이제

, 나는 원래 지점에서 잘못된 결과를 얻을.

아무도 무슨 일이 일어나고 있는지 실마리가 있습니까? 같은 결과로 scipy에서 루틴을 사용해 보았습니다. 문서 자체가 페이지의,

답변

1

당신이 좋아하는 문서를 바닥, 이렇게 here를 참조하는 방법을 간단히 설명에 말한다 : 당신이 irfft(pk, 8)을 할 경우

In other words, irfft(rfft(a), len(a)) == a to within numerical accuracy. 

이것은 사실이 아니다! 문제는 패딩 외에 홀수 샘플과 푸리에 변환의 대칭 때문입니다. len(p)이 홀수 일 경우에는 전혀 문제가 없습니다. 더 나은 이해를 위해

이 고려 :

당신이 자세히 보면 의미
>>> p = np.array([1.,2.2,4.,1.]) 
>>> np.fft.fft(p) 
array([ 8.2+0.j , -3.0-1.2j, 1.8+0.j , -3.0+1.2j]) 
>>> np.fft.fftfreq(len(p)) 
array([ 0. , 0.25, -0.5 , -0.25]) # 0.5 only occurs once negative 
>>> np.fft.rfft(p) 
array([ 8.2+0.j , -3.0-1.2j, 1.8+0.j ]) 
>>> np.fft.rfftfreq(len(p)) # (not available in numpy 1.6.) 
array([ 0. , 0.25, 0.5 ]) # 0.5 occurs, here positive, it does not matter 

# also consider the odd length FFT 
>>> np.fft.fftfreq(len(p)+1) 
array([ 0. , 0.2, 0.4, -0.4, -0.2]) # 0.4 is in there twice. 

# And consider that this gives the result you expect: 
>>> symmetric_p = np.fft.rfft(p) 
>>> symmetric_p[-1] /= 2 
>>> np.fft.irfft(symmetric_p, 8)[::2]*(8./4.) 
array([ 1. , 2.2, 4. , 1. ]) 

. 계산 된 FFT 주파수는 입력 샘플이 짝수 일 경우 이 아닌 대칭입니다. 대신에 여분의 음의 주파수가 있습니다 (실제로 위상 변화가 없기 때문에 실제로 양의 주파수가 될 수도 있습니다).

다른 주파수로 채우기 때문에 (실제 이유가 없습니까?) RFFT가 갑자기이 빈도에 대한 추가 "공간"을 갖게됩니다. 따라서 FFT 관점에서 볼 때, 보통 한 번 발생하는 음의 빈도 만 양의 빈도로 추가합니다 (기본적으로 두 배로 증가한다는 의미입니다). symmetric_p 위를 보면이 빈도를 반으로 줄이면 예상되는 결과가 패딩으로 제공됩니다 (패딩없이 예상되는 결과를 제공하지 않음).

+0

매우 명확합니다. seberg에게 감사드립니다. – gg349