DFT 파생 상품?

Sep 04 2020

하나 있어요? 연속 변형은 다음을 수행합니다.$f'(t) \rightarrow j \omega F(\omega)$ -하지만 $jkX[k]$ 확실히 DFT가 아닙니다.

그것을 찾으려면 유용한 단순화가 있어야합니다. $\text{DFT}(x[n] - x[n-1])$, 어디 $x[n] = \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N}$, 또한 하나의 드롭 된 샘플 ( x[0])을 고려하면서 -그런 단순화를 볼 수 없습니다.


참고 :$x[n] = ...$위는 신호의 출처가 아닌 내가 사용하는 IDFT의 정의입니다. 신호는 가능한 가장 일반적인 것으로 가정해야합니다. 주기적이지 않고 복잡하거나 실제 일 수 있지만 유한해야합니다.

참고 2 : 수락 된 답변에 대한 몇 가지 중요한 경고 (및 직접 모순)에 대한 내 답변을 참조하고 선택적으로 답변 아래의 의견 토론을 참조하십시오. 자세한 논의를 위해 @CedronDawg에게 감사드립니다.

주 3 : "미분"= 유한 차분 (이 질문을 위해).

답변

6 OlliNiemitalo Sep 04 2020 at 19:14

제안한 내용에 대한 자세한 답변을 얻으려면 이산 푸리에 변환 (DFT) 및 역 이산 푸리에 변환 (IDFT)에 사용되는 정규화에 대해주의해야합니다.

$$\text{DFT: }\quad X[k] = \sum_{n=0}^{N-1} x[n] e^{-j 2\pi kn/N}\tag{1}$$ $$\text{IDFT: }\quad x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j 2 \pi k n / N}\tag{2}$$

그것들은 MATLAB, Octave, NumPy 및 SciPy fft와 직접 호환되는 정규화를 가지고 있습니다 ifft. 색인$k$ 과 $n$ 로부터 달아 나다 $0$ ...에 $N-1$. (MATLAB과 Octave는 인덱싱 규칙이 다릅니다.$1$ ...에 $N$.) 그런 다음 :

$$\begin{array}{c}y[n] = x[n] - x[\operatorname{mod}(n-1, N)]\\ \begin{align}\\ Y &= \operatorname{DFT}\big(y\big)\\ &= \operatorname{DFT}(x*[1, -1, 0, 0, \ldots])\\ &= \operatorname{DFT}(x)\times\operatorname{DFT}([1, -1, 0, 0, \ldots])\\ &= X\times\operatorname{DFT}([1, -1, 0, 0, \ldots])\end{align}\end{array}\tag{3}$$ $$\Rightarrow Y[k]= X[k]\left(1 - e^{-j2\pi k/N}\right),\tag{4}$$

어디 $\operatorname{mod}$ 예를 들어, 부호없는 나머지를 제공합니다. $\operatorname{mod}(-1, N) = N - 1$, 상징물 $*$ 길이를 나타냄$N$ 원형 컨볼 루션 및 $\times$ 곱셈을 나타내며 모든 시퀀스의 길이 $N$.

이산 시간 도메인의 원형 컨볼 루션은 DFT 및 IDFT를 사용하여 도메인 간의 시퀀스를 변환하는 경우 이산 주파수 도메인의 곱셈과 정확히 동일합니다. 예를 들어 Circular Convolution-MIT OpenCourseWare를 참조하십시오 . 이산 시퀀스의 "선형"컨볼 루션의 경우 이러한 우아한 동등한 연산 쌍이 없기 때문에 질문에 대한 답변으로 제안 된 표현이 완전히 만족스럽지 않을 것이라고 생각합니다.

출력 범위의 왼쪽으로 확장되는 입력 신호 고려 $0 \le n < N$IDFT의 경우 모듈로 인덱싱을 사용하여 역방향 차이 를 계산하는 것은 조건부로 계산하지 않고 계산하는 것과 같습니다.

$$x[n] - x[\operatorname{mod}(n-1, N)] = x[n] - x[n-1]\quad\text{conditionally}\tag{5}$$

일부 인덱스에 대해서만 계산한다는 조건 하에서 :

$$0 < n < N,\tag{6}$$

또는 $0 \le n < N$ 신호에 주기성의 힌트가 있다는 조건에서 :

$$x[-1] = x[N-1].\tag{7}$$

Eq를 만족하는 충분하지만 필요하지 않은 조건. 7은$x$ 이다 $N$-정기적이지만 질문에서 유한으로 정의 된 신호에 의해 금지됩니다. 식을 만족하는 다른 조건의 예. 7은$x[-1] = x[N-1] = 0$.

@CedronDawg의 첫 번째 답변 은 주파수 영역에서 Eq의 오류를 수정하는 공식을 제공합니다. 5 조건이 충족되지 않는 경우 :$Y[k] = X[k]\left( 1 - e^{-j2\pi k/N} \right) - x[-1] + x[N-1]$. 대체 파생으로 길이-$N$ 시간 영역 수정은 임펄스입니다.

$$\begin{align}&\big[x[0] - x[−1] - \big(x[0] - x[N-1]\big),\, 0,\, 0,\, \ldots\big]\\ = &\big[x[N-1] - x[-1],\, 0,\, 0,\, \ldots\big],\end{align}\tag{8}$$

주파수 영역에서 상수 ( DFT 쌍 및 속성 : 쌍 행 2, 속성 선형성 참조) :

$$x[N-1] - x[-1],\tag{9}$$

모든 요소에 추가 될 $Y$식에 의해 계산. 4.

일반 $x$, 식의 조건. 식 6 5 길이 사용 가능$N+1$DFT와 IFT는 DFT에 대한 입력을 오른쪽으로 한 단계 이동하고 마지막으로 IDFT의 출력을 왼쪽으로 한 단계 이동하여 후진 차이를 계산합니다. 전방 차이로$x[n + 1] - x[n]$, 시프트가 필요하지 않으며 0 번째 샘플을 버리는 것과 일치한다고 생각합니다. 유한 시퀀스에 의한 컨볼 루션의 순환 컨볼 루션 구현의 경우, 더 긴 변환을 사용하는 것이 IDFT 출력의 충분히 큰 부분에서 순환 효과를 피하는 일반적인 트릭입니다. 그런 다음 부분 IDFT 출력, 특히 짧은 출력의 DFT를 얻으려면 지름길이 없다고 생각합니다.

우리는 아마도 다음과 같이 질문을 다시 표현할 수 있습니다 : 길이의 DFT는 무엇입니까? $N-1$ 앞으로 차이 $x$ 길이 $N$, 주어진 $x$ 과 $X_{N-1} = \operatorname{DFT}(x_{N-1})$, 길이 $N-1$ 부분 시퀀스의 DFT $x_{N-1} = \big[x[0], x[1], \ldots, x[N-2]\big]$? Eq. 4 우리는 :

$$y_{N-1} = x_{N-1}*[-1, 0, 0, \ldots, 0, 0, 1]\tag{10.1}$$ $$\Leftrightarrow Y_{N-1} = X_{N-1}\times\operatorname{DFT}([-1, 0, 0, \ldots, 0, 0, 1])\tag{10.2}$$ $$\Rightarrow Y_{N-1}[k] = X_{N-1}[k]\big(e^{j2\pi k / (N - 1)} - 1\big),\tag{10.3}$$

각 시퀀스의 길이 $N-1$. 원하는 순방향 차이$f_{N-1}$ is :

$$f_{N-1} = \big[x[1] - x[0],\, x[2] - x[1],\, \ldots,\, x[N-1] - x[N-2]\big].\tag{11}$$

식. 10.1은 다음으로 확장 될 수 있습니다.

$$y_{N-1} = \big[x[1] - x[0],\, x[2] - x[1],\, \ldots,\, x[0] - x[N-2]\big].\tag{12}$$

Eqs를 비교함으로써. 11과 12에서 다음과 같이 볼 수 있습니다.

$$f_{N-1} = y_{N-1} + \big[\ldots,\, 0,\, 0,\, x[N-1] - x[0]\big],\tag{13}$$

괄호 안의 시퀀스 길이 $N-1$. Eq의 양쪽 DFT를 취합니다. 13 및 식 적용. 10.3은 답을 제공합니다.

$$\begin{align}F_{N-1}[k] &= Y_{N-1}[k] + (x[N-1] - x[0])e^{j2\pi k/(N-1)}\\ &=X_{N-1}[k]\big(e^{j2\pi k / (N - 1)} - 1\big) + (x[N-1] - x[0])e^{j2\pi k/(N-1)}.\end{align}\tag{14}$$

이것은 길이입니다 $N-1$ 길이의 DFT $N-1$ 앞으로 차이 $x$ 길이 $N$.

또는 샘플로 표시되는 대역 제한 신호 의 미분에 관심이있을 수 있습니다 .

4 CedronDawg Sep 04 2020 at 20:00

[편집 :이 대답은 x [n]이 입력 신호 (연속적인 미분 함수에서 샘플링 된 것 같음) 인 것을 기반으로합니다. 이는 OP의 질문에 대한 오해였으며 찾고 있던 것은 입력 스펙트럼의 변환이라는 것입니다. 선형 1 차 차이의 스펙트럼에 신호를 보냅니다. 분석 프레임 내에서 원형 첫 번째 차이의 스펙트럼을 원하는 경우 기울기 항이 필요하지 않습니다. 또한, 원 주차 스펙트럼의 DC 빈이 0이되는 것을 공식에서 알 수 있습니다.]

이것은 Olli가 정의에서 직접 수행하고 N주기 신호를 가정하지 않는 것과는 다른 접근 방식입니다.

$$ \begin{aligned} Y[k] &= \text{DFT}(x[n] - x[n-1]) \\ &= \text{DFT}(x[n]) - \text{DFT}(x[n-1]) \\ &= X[k] - \text{DFT}(x[n-1]) \\ &= X[k] - \sum_{n=0}^{N-1} x[n-1] e^{-i\frac{2\pi}{N}kn } \\ &= X[k] - \sum_{m=-1}^{N-2} x[m] e^{-i\frac{2\pi}{N}k(m+1)} \\ &= X[k] - e^{-i\frac{2\pi}{N}k} \sum_{m=-1}^{N-2} x[m] e^{-i\frac{2\pi}{N}km} \\ &= X[k] - e^{-i\frac{2\pi}{N}k}\left[ \sum_{m=0}^{N-1} x[m] e^{-i\frac{2\pi}{N}km} + x[-1]e^{i\frac{2\pi}{N}k} - x[N-1] e^{-i\frac{2\pi}{N}k(N-1)} \right] \\ &= X[k] - e^{-i\frac{2\pi}{N}k}\left[ X[k] + x[-1] e^{i\frac{2\pi}{N}k} - x[N-1] e^{-i\frac{2\pi}{N}k(N-1)} \right] \\ &= X[k]\left( 1 - e^{-i\frac{2\pi}{N}k} \right) - \left[ x[-1] - x[N-1] e^{-i\frac{2\pi}{N}k(N-1)}e^{-i\frac{2\pi}{N}k} \right] \\ &= X[k]\left( 1 - e^{-i\frac{2\pi}{N}k} \right) - x[-1] + x[N-1] \\ \end{aligned} $$

N주기 신호의 경우 $x[-1] = x[N-1] $ 따라서 결과는 다음과 같습니다.

$$ Y[k] = X[k]\left( 1 - e^{-i\frac{2\pi}{N}k} \right) $$

정규화를 고려하는 것이 중요합니다. 저는 기존의 정규화되지 않은 순방향 DFT 정의를 사용했습니다. OP의 역 DFT 정의에서 알 수 있듯이 (더 적절한 IMO) 1 / N 정규화를 사용하면 표현식은 다음과 같습니다.

$$ Y[k] = X[k]\left( 1 - e^{-i\frac{2\pi}{N}k} \right) + \frac{x[N-1]-x[-1]}{N} $$

이제 마지막 항은 분명히 경사 계산이됩니다.


OverLordGoldDragon의 의견에 대한 응답. 기존 정규화 사용 :

$$ x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} nk } $$

연속적으로 만들어 봅시다.

$$ x(n) = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} nk } $$

n에 대한 미분을 취하십시오.

$$ \begin{aligned} \frac{dx}{dn} (n) &= \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} nk } \left(i \frac{2\pi}{N} k \right) \\ &= \frac{2\pi}{N^2} \sum_{k=0}^{N-1} i k X[k] e^{i \frac{2\pi}{N} nk } \\ \end{aligned} $$

따라서 초기 주장은 정확하지 않으며 연속 도함수에 대한 DFT에 적용됩니다.

체인 규칙에 따라 :

$$ \frac{dx}{dt} = \frac{dx}{dn} \cdot \frac{dn}{dt} $$

미분에 대한 근사에 사용하는 미분은 절반의 샘플 이동이 포함되어 있으므로 최상의 미분은 아닙니다. 일반적으로 선호하는$(x[n+1]-x[n-1])/2$. 이것은 중앙에 유지되고 더 높은 주파수 범위에서 "노이즈를 증폭"하지 않습니다.

댓글도 약간 떨어져 있습니다. $$ \begin{aligned} \left( 1 - e^{-i\frac{2\pi}{N}k} \right) &= e^{-i\frac{\pi}{N}k} \left( e^{i\frac{\pi}{N}k} - e^{-i\frac{\pi}{N}k} \right) \\ &= e^{-i\frac{\pi}{N} k} 2i \sin\left( \frac{\pi}{N}k \right) \\ &= e^{-i\frac{\pi}{N} k} 2 e^{i \frac{\pi}{2} } \sin\left( \frac{\pi}{N}k \right) \\ &= e^{-i\left( \frac{\pi}{N} k - \frac{\pi}{2} \right) } 2 \sin\left( \frac{\pi}{N}k \right) \\ \end{aligned} $$

그래서

$$ \left| \left( 1 - e^{-i\frac{2\pi}{N}k} \right) \right| = 2 \sin\left( \frac{\pi}{N}k \right) $$

과

$$ \arg \left( 1 - e^{-i\frac{2\pi}{N}k} \right) = -\frac{\pi}{N} k + \frac{\pi}{2} = - \frac{\pi}{2} \left( 1 - \frac{2k}{N} \right) $$

기어 전환, $k=0$

$$ Y[0] = \frac{x[N-1]-x[-1]}{N} $$

따라서 차동의 DC 구성 요소는 예상대로 프레임의 평균 기울기입니다.

저는 교과서를 읽지 않아서 정말 다룰 수 없습니다. 흥미로운 것은 항상 유용함과 동의어가 아닙니다.

나는 스스로 배운 다음 온라인 조사를 통해 내 결과를 확인합니다. 저에게 놀라운 것은 정확성을 가장 먼저 달성 한 제 주파수 공식이 아직 커리큘럼에 포함되어 있지 않다는 것입니다.


퍼즐이 해결되었습니다. 이런.

0을 중심으로하지 않는 한 $k=-1$ 대신에 $k=N-1$, 미분은 더 높은 주파수 보간 (해당 지점에서 DTFT의 미분에 해당)이됩니다.

이것은 "Fluffy Cloud"사례와 유사합니다. DFT를 사용하여 어떤 모양을 그리기 위해 푸리에 계수를 얻는 방법?


내 혼란의 일부는 확장 된 역 DFT를 x [n]으로 사용하고 있다는 것입니다. 따라서 x [-1]을 계산할 수 있고 x [N-1]과 일치하는 반면 코드에서는 생성합니다. 처음부터 신호 x [n].

밝히다

$$ y[n] = x[n] - x[n-1] $$

과

$$ Y[k] = DFT(y[n]) $$

귀하의 코드는 "샘플을 삭제"하고 Olli와 내 답변은 x [-1]을 사용합니다. Olli의 대답은 주기성이 있다고 가정하고 (계속 수락하십시오) 내 것은 그렇지 않습니다 (원시 신호로 작업하고 있다고 생각 함). np.diff 호출처럼 "샘플을 삭제"하는 것이 적절하다고 생각하지 않습니다. 그렇게한다면 1에서 N-1 로의 문제를 0에서 M-1로 재구성해야합니다. 여기서 M = N-1이면 샘플을 삭제하지 않은 것과 같은 상황이됩니다.

"샘플을 드롭"하면 처음 두 줄을 무효화하는 DFT 정의가 변경됩니다.

조금 인내심을 갖고 퍼즐 설명을 명확히하겠습니다.


많은 설명없이 여기에 "퍼즐 풀림"이 있습니다. 상위 k 개 값을 양의 주파수로 사용하여 x를 보간하면 플롯 된 점 사이에 많은 진동이 발생합니다. 따라서 Y.

크기 조정은 $ 2\pi $ t 및 $\frac{dn}{dt}$ 요인, 그래서 나는 당면한 문제에 눈에 띄지 않기 때문에 코드를 복잡하게 만들지 않았습니다.

numpy를 np로 가져 오기
matplotlib.pyplot을 plt로 가져 오기

# ================================================ ========
def main () :

        N = 128
        
        t = np.linspace (0, 1, N, False)
        x = np.cos (2 * np.pi * t)
        
        X = np.fft.fft (x)

        plt.plot (x)
        plt.show ()
        
        Y = np.zeros (N, dtype = 'complex')
        
        k 범위 (N) :
          Y [k] = X [k] * 1j * k

        y = np.fft.ifft (Y)
        
        plt.plot (y.real)
        plt.plot (y.imag)
        plt.show ()
        

        Z = np.zeros (N, dtype = 'complex')
        
        H = N >> 1
        
        k 범위 (-H, H) :
          k> = 0 인 경우 :
             Z [k] = X [k] * 1j * k
          그밖에:
             Z [k + N] = X [k + N] * 1j * k

        z = np.fft.ifft (Z)
        
        plt.plot (z.real)
        plt.plot (z.imag)
        plt.show ()


# ================================================ ========
본관()

마지막 줄거리는 다음과 같습니다.

다음은 공식에 대한 테스트 프로그램입니다.

numpy를 np로 가져 오기

# ================================================ ===========================
def main () :

        L = 10000 # 신호 길이
        F = 100 # 프레임 위치 

        N = 16 # 프레임 크기 = DFT 샘플 수
        
        P = np.zeros (L) # 위치
        D = np.zeros (L) # 차이
        
        n 범위 (L) :
          P [n] = 1.2 + 0.3 * n + 0.045 * n * n

        n 범위 (1, L) :
          D [n] = P [n]-P [n-1]
          
        x = P [F : F + N]  
        y = D [F : F + N]
        
        X = np.fft.fft (x) / N
        Y = np.fft.fft (y) / N
        
        Z = np.zeros (N, dtype = complex)
        
        C = (x [N-1]-P [F-1]) / N

        k 범위 (N) :
          Z [k] = X [k] * (1-np.exp (-1j * (2.0 * np.pi / N) * k)) + C
        
        n 범위 (N) :
          print ( "% 2d % 10.6f % 10.6f % 10.6f % 10.6f"% \
               (n, Y [n] .real, Y [n] .imag, Z [n] .real, Z [n] .imag))
        

# ================================================ ===========================
본관()

결과는 다음과 같습니다.

 0 9.930000 0.000000 9.930000 0.000000
 1 -0.045000 0.226230 -0.045000 0.226230
 2 -0.045000 0.108640 -0.045000 0.108640
 3 -0.045000 0.067347 -0.045000 0.067347
 4 -0.045000 0.045000 -0.045000 0.045000
 5 -0.045000 0.030068 -0.045000 0.030068
 6 -0.045000 0.018640 -0.045000 0.018640
 7 -0.045000 0.008951 -0.045000 0.008951
 8 -0.045000 0.000000 -0.045000 -0.000000
 9 -0.045000 -0.008951 -0.045000 -0.008951
10 -0.045000 -0.018640 -0.045000 -0.018640
11 -0.045000 -0.030068 -0.045000 -0.030068
12 -0.045000 -0.045000 -0.045000 -0.045000
13 -0.045000 -0.067347 -0.045000 -0.067347
14 -0.045000 -0.108640 -0.045000 -0.108640
15 -0.045000 -0.226230 -0.045000 -0.226230
2 CedronDawg Sep 11 2020 at 15:27

내 다른 답변에 대한 RB-J의 의견에 대한 답변 :

"DFT 주기성 데니어는 x [-1]로 무엇을합니까?"

"x [n]의 DFT ("X [k] "라고 함)에 ej2πdk / N (여기서 d는 정수)을 곱하면 DFT가 주기성에 매우 관심이 있음을 알 수 있습니다. –"

그리고 분석적으로 계산 된 PSD의 단위를 FFT의 단위와 일치시키는 것과 유사합니다.

"// DFT는 신호가 프레임 외부에있는 것을 고려하지 않습니다 .// ... 절대? --- 좋아 @CedronDawg, X [k]에 ej2πdk / N을 곱할 때 DFT는 무엇을"고려 "합니까? 여기서 d∈ Z? (0≤k <N에 대한 모든 X [k]) – robert bristow-johnson 4 시간 전 "

좋습니다. 샘플이 많은 신호부터 시작하겠습니다. N 개의 샘플이 들어있는 섹션을 분석한다고 가정 해 보겠습니다. 이를 위해 분석 프레임을 설정하겠습니다. 이는 내 분석 프레임의 첫 번째 샘플이 인덱스 0에 있도록 샘플을 다시 인덱싱하는 것을 의미합니다.이 섹션에서 DFT를 가져 오려고하므로 DFT 프레임이라고도합니다.

이것은 "윈도우"와는 다릅니다. 또한 섹션의 모든 샘플에 대해 1을 갖는 사각형 창 함수를 정의하고 다른 모든 곳에서는 0을 정의 할 수 있습니다. 창 함수는 기본 인덱싱에 인덱싱되며 새 인덱싱 프레임을 설정하지 않습니다.

원하는 경우 분석 프레임과 관련된 창 함수를 정의 할 수도 있습니다. 내 프레임에 걸친 직사각형 창은 DFT를 취하는 측면에서 비활성 / 부드럽습니다. DFT 정의는 이와 같은 암시 적 창을 갖는 것으로 간주 할 수 있지만 정의의 일부는 아닙니다. 정규화되지 않은 정의는 다음과 같습니다.

$$ X[k] = \sum_{n=0}^{N-1} 1 \cdot x[n] \cdot e^{-i \frac{2\pi}{N} kn } $$

따라서 섹션이 신호의 시작 부분에 있지 않으면 $x[-1]$내 분석 프레임 직전의 샘플을 참조합니다. 섹션이 신호의 시작 부분에있는 경우 정답은 다음과 같습니다.$x[-1]$정의되지 않았습니다. 가정을해야한다면 가장 논리적 인 답은 0이 될 것입니다.

이제이 섹션의 DFT를 사용하여 $ X[k] $ 값 $ 0 <= k < N $. 이 범위를 벗어난 값은 정의에 의해 평가 될 수 있으며주기가 N 인 주기적 스펙트럼이됩니다. 이것은 기본주기가 아닐 수 있지만이 논의와는 무관합니다.

우리는 이제 OP의 질문 (처음에 오해했던 것)의 시작점에 있습니다.

주어진 가치 $X[k]$ 역 DFT를 적용하고 $x[n]$ 값 $ 0 <= n < N $, 분석 프레임 내의 샘플. 스펙트럼과 마찬가지로 공식은$n$분석 프레임 밖의 값. 마찬가지로 결과 값은주기 N으로 주기적 시퀀스를 형성합니다. 이러한 확장 된 값이 분석 프레임 외부의 원래 신호 값과 일치해야한다고 가정, 주장 또는 정의 할 이유가 전혀 없습니다. 거부로 표시하려면 ....

또한 불가능합니다. $X[k]$ 값을 결정하는 원본 $x[-1]$가치입니다. 역 DFT를 확장하여 얻은 값은 다음과 같습니다.$x[N-1]$. 다시 말하지만, 이것이 원래 신호 값과 일치한다고 규정, 가정, 주장, 유지 또는 선언 할 근거가 없습니다.

이제 다음과 같은 요인을 사용하여 스펙트럼을 곱하거나 비틀거나 변조한다고 가정합니다. $ e^{i \frac{2\pi}{N} dk } $. 좋아요, 수학을합시다.

$$ Z[k] = X[k] \cdot e^{i \frac{2\pi}{N} dk } $$

역 DFT를 사용하십시오.

$$ \begin{aligned} z[n] &= \frac{1}{N} \sum_{k=0}^{N-1} Z[k] \cdot e^{ i \frac{2\pi}{N} nk } \\ &= \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{i \frac{2\pi}{N} dk } \cdot e^{ i \frac{2\pi}{N} nk } \\ &= \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{ i \frac{2\pi}{N} (n+d)k } \\ \end{aligned} $$

허락하다 $ m = n + d $ 그래서 $ n = m - d $.

$$ z[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{ i \frac{2\pi}{N} mk } = x[m \text{ mod } N] = x[ ( n + d ) \text{ mod } N] $$

최종 결과는 분석 프레임의 샘플이 $d$ 견본.

위와 같이, $z[n]$N 주기적 시퀀스를 형성하는 분석 프레임 외부의 역 DFT 정의를 사용하여 확장 할 수 있습니다. 이러한 값이 원래 신호와 일치한다고 가정 할 근거는 훨씬 적습니다.

OP의 질문은 $ y[n] = x[n]-x[n-1] $, 넌 발견 할 수 있니 $Y[k]$ ...에서 $X[k]$ 역 DFT를 취하지 않고 차이를 취한 다음 DFT를 취하지 않습니다.

OP는 다음과 같이 말했습니다. $x[n]$ 역 DFT에서 온 $X[k]$, 나는 실수로 원래 $x[n]$ 알려졌다.

그런 다음 Olli가 우아하게 대답했습니다. 그리고 내 대답의 정의에서 파생되었습니다. 조건$x[-1]= x[N-1]$ 확장 된 재구성 된 신호에 대해 충족됩니다.

따라서이 주기성 부인이 말했다.

2 OverLordGoldDragon Sep 09 2020 at 21:28

C. Dawg의 대답을 보완하고 이에 따라 기울기 추가를 무시하면 크기와 위상에 대한 영향은 다음과 같습니다.

$$ \begin{aligned} |X[k]| & \rightarrow M|X[k]| \\ \angle{(X[k])} & \rightarrow \phi + \angle{(X[k])} \\ \end{aligned} $$

어디

$$ \begin{aligned} M &= 2 \left| \sin{\left( \pi \frac{k}{N} \right)} \right| \\ \phi &= \frac{\pi}{N}(k\ \text{mod}\ N- N/2) \cdot \lceil k\ \text{mod}\ N \rceil \end{aligned} $$

그만큼 $\lceil k\ \text{mod}\ N \rceil$ 세트 $\phi$ 0으로 $k$ 의 배수입니다 $N$, 규칙 사용 $\angle(0 + 0i)=0$. 그래픽으로

포장되지 않은 $\phi$ 직선이므로 시간 영역 효과는 시간 이동입니다.


iDFT : 유한 차이가 샘플을 떨어 뜨리므로 인덱스는에서 1으로 실행되어야합니다 N - 1. 또한 경사 추가는 중복됩니다. 역 DFT는 원래 신호를 N 주기적으로 확장하므로 제로화됩니다.

아래의 Python 구현; 일종의 "가장 미미한"신호 인 임의의 정상 노이즈로 테스트되었습니다. 절대 오차는 1e-16이며 이는 단순히 플로트 오차입니다.

def d_idft(coef):
    N = len(coef)
    coef = coef * (1 - np.exp(-1j * 2 * np.pi / N * np.arange(N)))
    return np.fft.ifft(coef)[1:]

부록 : 아래는 답변 아래의 토론에서 정리 한 내 의견, 중요한 요점 /주의 사항을 요약하고 수용된 답변과 모순되는 내용입니다. 정말 길어질 것이므로 다른 연사를 포함하지 않았지만 표시된 발췌는 응답 내용을 암시해야합니다.


사면 기간 :

"무의미한 이산 도함수"-이것은 이산 도함수에 관한 것이 아니라 x [n]-x [n-1]에 대한 해석입니다. 때로는 파생물처럼 좋고, 다른 때는 cumsum을 취소한다는 의미에서 정확하지만, 다른 때는 거의 쓸모가 없지만, 요점은 우리가 찾는 주파수 영역과 동등한 시간 영역 변환이라는 것입니다.

귀하의 이산 파생에 관하여; 시작할 x [-1]이 없기 때문에 유일한 대안은 x [N-1]과 같은 역수이므로 다시 떨어집니다.

그것은 과장된 표현입니다. N-1 점 도함수를 인코딩하려면 N + 1 데이터 점 (원래 N 계수에 x [-1]을 더한 값)이 필요합니다. DFT는 완전한 인코딩입니다. 우리는 x [-1]을 필요로하지 않고도 그것을 반전하고 시간 영역에서 미분 할 수 있으므로 순전히 주파수 영역에서 작동하는 것이 가능해야합니다.

반례를 고려하십시오. x [-1]을 역전에서 가져 오지 않는다고 가정합니다. 그러면 우리가 프레이밍 한 원래 신호이어야하지만 x [-1]이 존재합니다. x [0]에서 x [N-1]까지 모두 0이고 x [-1] = 100 ^ 100 ...


"DFT는 입력이 주기적이라고 가정합니다."

나는 역전 이 연장되면 주기적 이라고 말했다 . DTF 는 공급 된 원래 신호 의 부분 만 설명합니다 . 시간 영역을 확장하여 앨리어싱 등을 분석 할 수 있지만 프레임 외부의 원래 신호에 대한 설명은 할 수 없습니다.

논쟁의 근원은 충분한 정의 , 즉 "가정"이 의미하는 바가 부족하기 때문입니다 . 당신과 나는 그것을 변환 자체의 기본이 아니라고 생각하지만, 우리는 또한 일부 컨텍스트 / 작업이 주기성을 요구한다는 데 동의합니다.


연속 유도 ($x(n)$)

역변환은 순방향 변환을 "반전"하고 연속 신호의 순방향 변환은 $N=\infty$. DTFT : 인코딩은 디코딩 (반전) 된만큼의 정보 (예 : ω)를 삽입하므로 임의로 이산화 될 수 있습니다. 반대로, 신호의 DFT는 신호의 포인트 수만큼 많은 계수를 요구하는 반면, 역은 유한 (또는 단순히 다른) N을 가정하므로 인코딩 된 것을 디코딩하지 않습니다.

N 유한 계수에서 무한 x (n)을 복원하므로 무한 압축 능력을 터무니없이 암시합니다 .

하지만 우리가 단순히 이산화된다면 $x'(n)\rightarrow x'[n]$? 그런 다음 압축 인수가 떨어집니다. 귀하의 표현은 np.diff와 비교하여 모양 측면에서 선형 처프를 상당히 잘 처리했으며 후자는 실제로 "진정한"파생물이 아니기 때문에 "더 정확한"것이 분명하지 않습니다. 연속 미분을 정당화하고 다시 이산화하는 것을 정당화하기 위해 수행해야 할 수학 작업이 있지만 결국 수행 될 수 있습니다.

2020 년 1 월 1 일 편집 : 실제로 할 수 있으며 삼각 보간 의 이산화 된 ( 이산이 아닌 ) 미분으로 해석됩니다.$x[n]$( 하지 의$x(n)$), 그리고 그러한 보간은 '더 좋은' $x[n]$, 더 정확한 미분. 낯선 사람이지만 이산화 된 FT와 DFT는 때때로 함께 작동 할 수 있습니다 .

그러나 Cedron의 파생은 여전히 ​​잘못 정규화되지만 그의 코드 는 정확합니다. 이상하게도$x'[n]$이산화 된 FT 미분 의 이산 iFT (iDFT) 를 통해 발견 되므로$2\pi / N$속하지 않습니다. ... 아니면 다른 가정에 속할 수도 있지만 아직까지 본 적이 없습니다.

OverLordGoldDragon Sep 13 2020 at 04:21

우승자 : Olli의 솔루션 :

$$ F_{N-1}[k] = X_{N-1}[k]\big(e^{j2\pi k / (N - 1)} - 1\big) + (x[N-1] - x[0])e^{j2\pi k/(N-1)} $$

코드 + 데모 :

def dft(x):
    return np.fft.fft(x[:-1])

def d_idft(coef, x):
    M = len(x) - 1  # N - 1
    exp = np.exp(1j * (2 * np.pi / M) * np.arange(M))
    coef = coef * (exp - 1) + (x[-1] - x[0]) * exp
    return np.fft.ifft(coef)

그러나 문제가 완전히 해결되지는 않았습니다. 모든 속성 1 및 2가 충족되고, 무시할 수있는 재구성 손실, DFT(DIFF(x))및이 방법 에서 직접 계산 된 계수의 매우 작은 차이 . 에서 1e-12와 같이 "매우 작음" , FFT의 부동 오류 일 수 있습니다. - 비교 코드 .

  1. 측면에서 관계가 필요 $X_N=\text{FFT}(x)$, 아닙니다 $X_{N−1}=\text{FFT}(x[\text{:-1}])$
  2. 계산을 위해 원래 신호를 입력으로 요구할 수 없습니다. $F_{N−1}$ (복구 불가 $X_{N−1}$).

Olli가 계수 ($X_{N−1}$), 더 어려운 문제가 해결되었으므로 (1) 및 (2)에 대한 해결 방법이 가능해 보입니다.


이 답변은 문제를 더욱 구체화하고 제안 된 솔루션을 테스트하며 다른 답변의 결함을 설명하여 해결 방법을 안내하는 것을 목표로합니다.

슬로프 기간 : 필요 여부$x$주기적이거나 아닙니다 . 그것 없이는$Y[0] \neq \sum_{n=1}^{N-1} (x[n] - x[n-1])$. 이것은 미적분학의 기본 정리와 다소 관련이 있습니다. 유한 차이가 미분이면$x[n]$ 유한 한 차이 인 함수의 역도 함수이므로 $Y[0]$ 아주 간단합니다 $x[N-1]-x[0]$ -[$\int_a^b f'(x)dx=f(b)-f(a)$].

더 정확하게, $x[n-1]-x[0]$간격 의 순 유한 차이 와 같습니다 . 끝점을 변경하지 않고이 값을 다른 값으로 강제 설정하십시오.


응답 속성 -결과 표현식이 충족해야하는 사항 :

  1. len(Y) == N - 1; 유한 차분은x
  2. $Y[0] = \sum_{n=1}^{N-1} (x[n] - x[n-1])$
  3. $Y$ 다음과 같이 표현됩니다. $X$, $j$, $n$, $N$, 그리고 아마도 자체 색인-다른 매개 변수 없음; $x$ 이내라면 괜찮습니다 $[0, N-1]$,에서 복구 할 수 있으므로 $X$.

속성 정당화 :

Olli의 대답 은 N+1-point DFT & IDFT; 이것은 유효하지 않으며 샘플을 삭제하지 않으려는 시도도 마찬가지입니다. 일부 응용 프로그램에서는 유용 할 수 있지만 근본적으로 결함이 있으므로 범용이 아닙니다. 그 이유는 다음과 같습니다.

소환 $+C$통합 할 때? 같은 이야기 : 차별화는 정보를 잃습니다 . 허락하다$x'[n] = x[n] - x[n-1]$. 복원 할 수 없습니다$x[n]$ ...에서 $x'[n]$, 그 모양 만 ; DC 오프셋 없습니다. 원본 샘플 하나를 알고 있다면$x[h]$, 우리는 전체 신호를 복원 할 수 있습니다 $x'[n]$, 우리가 알고 있기 때문에 $x[N-1]-x[0] = \sum x'[n]$, 그리고 우리는 $x[n-1]$ 시작하는 누적 합계를 통해 $x[h]$. 초기 값 문제와 유사합니다.


Cedron의 결과 ,

$$ Y[k] = X[k]\left( 1 - e^{-i\frac{2\pi}{N}k} \right) + (x[N-1]-x[-1]), $$

속성 중 어느 것도 충족 하지 않지만 올바른 방향으로 명확하게 나아갑니다.


Cedron의 결과 + 모드, 테스트 됨 (mod =$x[0]$ 대신에 $x[-1]$) :

실질적으로 다른 세 가지 크기 및 위상 스펙트럼은 모두 거의 정확히 동일한 신호로 반전 변환됩니다. 모든 오류는 부동 소수점으로 인한 것 같습니다. 여기에서 녹색은 "근거 사실"입니다. - 코드 .

d_idft위의 근거에 따라 수정하면 어떻게 되나요? 즉, drop coef[0], DC 용어 :

def d_idft(coef, x, slope=True):
    M = len(coef) - 1
    coef = coef[1:] * (1 - np.exp(-1j * 2 * np.pi / M * np.arange(M)))
    coef += (x[-1] - x[0])
    return np.fft.ifft(coef)

오류가 심각해집니다. 좋지 않습니다. 또한 x편의상 입력으로 전달 합니다.


우리가 이미 작동한다면 왜 더 멀리 볼까요? (즉, float64 내의 MAE)-단순히 잘못되었고 MAE가 중요한 신호를 찾지 못했다고해서 그것이 존재하지 않거나 실제로 더 중대한 의미가 없다는 것을 의미하지는 않습니다.


테스트 스크립트 : 이 스크립트를 통과 하면 솔루션이 작동한다는 것을 알고 있습니다 .