2017-12-05 24 views
0

이산 퓨리에 변환을 사용하여 함수의 근사값을 얻으려고합니다.이 함수의 2M + 1 값이 주어졌습니다.이산 푸리에 변환을 사용한 삼각 보간

내가 계수와 근사에 대한 몇 가지 표현을 본 적이 있지만 내가 원래하려고했던 사람이 있었다 (12)와 I 링크에 대해 사과 * http://www.chebfun.org/docs/guide/guide11.html

에로 (13),하지만 분명히 StackOverflow는 라텍스를 지원하지 않습니다.

나는 계수를 주어진 근사값을 계산하는 함수와 계수를 계산하는 함수를 가지고 있지만 이전 함수도 반환합니다. 일부 값으로 테스트했지만 결과가 전혀 맞지 않았습니다. 필자는 둘 다 numpy.fft.fft와 비교했습니다. 계수가 일치하지 않고 첫 번째 함수로 fft를 전달해도 좋은 근사값이 나오지 않으므로 계수 만 문제가되지는 않습니다. 내가 당신의 코드를 이해 확실하지 않다

def model(cks, x): 
n = len(cks) 
assert(n%2 == 1) 
M = (n-1)//2 
def soma(s): 
    soma = 0 
    for i in range(n): 
     m = -M + i 
     soma += cks[i]*cmath.exp(1j*m*s) 
    return soma 
soma = np.vectorize(soma) 
return soma(x) 

def fourier(y): 
n = len(y) 
assert(n%2 == 1) 
M = (n-1)//2 
def soma(k): 
    soma = 0 
    for i in range(n): 
     t = 2*math.pi*i/n 
     soma += y[i]*cmath.exp(-1j*k*t) 
    return (1/n)*soma 
cks = np.zeros(n, dtype='complex') 
for i in range(n): 
    j = -M + i 
    cks[i] = soma(j) 
return cks, (lambda x: model(cks,x)) 

답변

0

,하지만 당신은 앞으로 역이 DFT 가지고있는 것처럼 그것은 나에게 같습니다

여기 내 코드입니다. 그 중 하나는 pi을 사용하지 않지만 반드시 사용해야합니다.

보간 샘플을 얻는 데 관심이 있다면 DFT를 적용하고 0으로 채운 다음 역 DFT를 계산할 수 있습니다. (MATLAB 코드를 사용하고 있습니다. 왜냐하면 그것이 내가 알고있는 것이기 때문에 그렇다고 생각합니다. 쉬운) 읽는 :

f = randn(1,21);      % an input signal to be interpolated 
F = fft(f);       % forward DFT 
F = fftshift(F);      % shift zero frequency to middle of array 
F = [zeros(1,60),F,zeros(1,60)];  % pad with equal number of zeros on both sides 
F = ifftshift(F);     % shift zero frequency back to first array element 
fi = ifft(F) * length(fi)/length(f); % inverse DFT, normalize 
            % `fi` is the interpolated `f` 

% plotting 
x = linspace(1,length(fi)+1,length(f)+1); 
x = x(1:end-1); 
plot(x,f,'x'); 
xi = 1:length(fi); 
hold on 
plot(xi,fi); 

enter image description here

을 당신이 DFT를 구현하고 처음부터 DFT를 반전, 알 필요가처럼 당신이 느끼는 경우에 당신이 implement the latter using the former을 할 수 있습니다.

당신은 DFT의 요소의 진폭과 위상에 의해 주어진 A_nΦ _n으로, 이동 사인 함수의 합으로 연속 함수를 만들 the equation for the Fourier series를 따르십시오.