이산 부립엽 변환의 실현

개시하다


이번에python으로 적당한 합성파를 생성하여 이산부립엽 변환과 역이산부립엽 변환을 진행하였다.
첫 투고라 내용이 보기 싫겠지만 저도 이 자리를 빌려 자료 만드는 연습을 해보고 싶어요.

차리다


이번 도입은 다음과 같이 이용한다.
%matplotlib inline

import functools
import matplotlib.pyplot as plt
import cmath
import random

import numpy as np

Sin 웨이브의 생성


먼저 기본적인 Sin Power를 만듭니다.
이번x은 0.1분초의 속도로 0에서 2π로 변화np.sin(x)에 대응하는y의 값을 구한다.
다음의 코드와 실행 결과를 보여 주십시오.
# ステップ
s = 0.1
# 横軸(0~2πまで)
x = np.arange(0, 2 * cmath.pi, s)
y1 = np.sin(x)
plt.plot(x, y1)
실행 결과는 이렇다

주파수


주파수(ω), 위상(b), 진폭(a)이 변한 후의 신파는 이런 느낌이다
${\displaystyle y = a×\sin{(ωx + b)}}$
코드로 보는 공식도 그대로 있어 이해하기 쉽다.
# 振幅
a = 2
# 位相
b = cmath.pi
# 周波数
o = 2
# sin波
y2 = a * np.sin(o * x + b)
plt.plot(x, y2)
마찬가지로 실행 결과 진폭 2Hz의 주파수에서 위상 편이π를 하기 때문에 OK

합성파의 생성


합성파는 간단하게 조합할 수 있다.이번에는 먼저 만든 y1과 y2의 합성파를 만들었다.
y = y1+y2
plt.plot(x, y)
매트릭스 연산도 빠르게 진행되기 때문에 더 복잡한 합성파를 만드는 것을 추천합니다.
아래의 파형은 y1+y2와 같다.(본질이 아니면 건너뛰어도 된다)
X = x.reshape(1, -1)
O = np.array([1, 2]).reshape(-1, 1)
B = np.array([0, cmath.pi]).reshape(-1, 1)
A = np.array([1, 2]).reshape(-1, 1)
y = np.sum(A * np.sin(O * X + B), axis=0)
plt.plot(x, y)
같은 실행 결과(완전히 합성파로 변함)

DFT 설치


비키리산 부립엽 변환
https://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
아무튼 그런 공식입니다.
${\displaystyle F(t)=\sum_{x=0}^{N-1} f(x) e^{-i\frac{2\pi t x}{N}}\quad\quad }$
포문을 간단하게 쓰면 이런 느낌이에요.
def dft_(f):
    n = len(f)
    Y = []
    for x in range(n):
        y = 0j
        for t in range(n):
            a = 2 * cmath.pi * t * x / n
            y += f[t] * cmath.e**(-1j * a)
        Y.append(y)
    return Y
그런데 포문을 쓰는 게 촌스러워서 이런 느낌으로 쓰면 잘 나오나요?
def dft(f):
    n = len(f)
    A = np.arange(n)
    M = cmath.e**(-1j * A.reshape(1, -1) * A.reshape(-1, 1) * 2 * cmath.pi / n)
    return np.sum(f * M, axis=1)
변환, 변환 후 실부와 허부로 나누어 각각 가시화.
fy = dft(y)
plt.plot(fy.real)
plt.plot(fy.imag)
실행 결과는 이렇다

역이산 부립엽 변환


같은wiki의 역이산 부립엽 변환
${\displaystyle f(x)={\frac {1}{N}}\sum _{{t=0}}^{{N-1}}F(t)e^{{i{\frac {2\pi xt}{N}}}}\quad\quad}$
부립엽과 변환이 많지 않습니다. ${-i}는 ${i}로 바뀌었고, 마지막에는 ${N} 달러만 나누었습니다.
그러니까 다음 코드.
def idft(f):
    n = len(f)
    A = np.arange(n)
    M = cmath.e**(1j * A.reshape(1, -1) * A.reshape(-1, 1) * 2 * cmath.pi / n)
    return np.sum(f * M, axis=1) / n
실행 결과


numby는 빠른 부립엽 변환과 반변환이 있습니다.
이번에 만든 dft 변환 결과 numby의 ifft가 먹었다.
똑바로 움직여라.ω・)b
yd = np.fft.ifft(fy)
plt.plot(yd.real)

총결산


적당한 합성파를 만들어 이산 부립엽 변환과 역변환을 실현하다.
이산 부립엽의 변환이 생각보다 간단하다는 것을 발견했다.

최후


첫 투고 실험도 겸하고 있으니 내용이 너무 과한 건 용서해 주세요...(´/ω・‘)

좋은 웹페이지 즐겨찾기