이산 부립엽 변환의 실현: 변환 매트릭스 편
개시하다
배경.
재밌어 보여서 이산 부립엽 변환의 변환 행렬을 만들고 싶어요.
목표
이산 부립엽 변환의 변환 행렬을 만들고 실제 변환과 반변환이 가능한지 확인합니다.
이산 부립엽 변환
이산 부립엽 변환에 대한 설명
또한wiki의 공식에 따라 변환된 코드는 이전wiki에 실시되었으니 참고하시기 바랍니다.
변환 행렬
우선, 이산 부립엽 변환의 방정식은 다음과 같다.
${\displaystyle F(t)=\sum_{x=0}^{N-1} f(x) e^{-i\frac{2\pi t x}{N}}\quad\quad }$
t와 x를 T, X로 바꿔 분위기에서의 느낌(X와 T 모두 0~N-1의 1차원 배열로 변화)
${\displaystyle F(T)= f(X) e^{-i\frac{2\pi T X}{N}}=f(X)M}$
이제 변환 매트릭스 함수 만들기↓
dft.pyimport numpy as np
import cmath
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
N = 3
의 예에서 각각 무엇을 나타낸다.N = 3
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
print(A)
print('------------------')
print(T * X)
print('------------------')
print(M)
실행하다 보니까 이런 느낌이에요.[0 1 2]
------------------
[[0 0 0]
[0 1 2]
[0 2 4]]
------------------
[[ 1. +0.j 1. +0.j 1. +0.j ]
[ 1. +0.j -0.5-0.8660254j -0.5+0.8660254j]
[ 1. +0.j -0.5+0.8660254j -0.5-0.8660254j]]
T * X
N×N의 배열, (i, j)
의 요소(T * X)[i][j]
는 ${2^i×2^j}달러입니다.
그리고 ${M=e^{-i\racc{2\piTX}{N}의 나머지 부분M
을 계산합니다.↓ 여기 부분M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
실험
변환원이 되는 파형y
이 필요하기 때문에 적당히 인의 합성파로 제작한다.import numpy as np
import matplotlib.pyplot as plt
import dft
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
이런 느낌.
이산 부립엽 변환의 실현
샘플 수dft_matrix
를 다음 생성된 함수에 전달하여 변환 행렬N
을 얻습니다.
변환 매트릭스M
를 사용하는 매트릭스 계산에서 변환M
.행렬 연산은numbyy
이기 때문에 사용합니다.# 変換行列
N = len(y)
M = dft.dft_matrix(N)
# 波形 ⇒ M ⇒ 周波数表現
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
변환 결과
이어서 반변환을 진행하는데 이때 M의 반행렬을 구해야 한다.
역 행렬 변환도 numbynumpy.dot
이기 때문에 사용합니다.
그리고 변환된 numpy.linalg.inv
를 이전과 같은 요령에 따라 반변환한다.결과를 원래의 파형과 비교해 보자.inv_M = np.linalg.inv(M)
# 周波数表現 ⇒ -M ⇒ 波形
yd = np.dot(fy, inv_M)
print('元波形')
plt.plot(x, y)
plt.show()
print('逆変換後')
plt.plot(yd.real)
plt.show()
너무 완벽해(·)ω・)b
최후
dft를 묻고 바로 이동하는 코드를 거기에 두세요.(numby와 matplotlib이 없을 때는 pip로 살짝 넣으세요)import cmath
import numpy as np
import matplotlib.pyplot as plt
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
# 元波形生成部
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
# 変換行列の作成と変換
M = dft_matrix(len(y))
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
# 逆変換行列の作成と逆変換
inv_M = np.linalg.inv(M)
yd = np.dot(fy, inv_M)
print('逆変換後')
plt.plot(yd.real)
plt.show()
총결산
이산 부립엽 변환의 변환 행렬을 만들어 실제 변환과 반변환이 가능하다는 것을 증명했다.
결과:재미있다ρ(・ω・)
Reference
이 문제에 관하여(이산 부립엽 변환의 실현: 변환 매트릭스 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sai-sui/items/8b7c901b8fec891f9240
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이산 부립엽 변환에 대한 설명
또한wiki의 공식에 따라 변환된 코드는 이전wiki에 실시되었으니 참고하시기 바랍니다.
변환 행렬
우선, 이산 부립엽 변환의 방정식은 다음과 같다.
${\displaystyle F(t)=\sum_{x=0}^{N-1} f(x) e^{-i\frac{2\pi t x}{N}}\quad\quad }$
t와 x를 T, X로 바꿔 분위기에서의 느낌(X와 T 모두 0~N-1의 1차원 배열로 변화)
${\displaystyle F(T)= f(X) e^{-i\frac{2\pi T X}{N}}=f(X)M}$
이제 변환 매트릭스 함수 만들기↓
dft.pyimport numpy as np
import cmath
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
N = 3
의 예에서 각각 무엇을 나타낸다.N = 3
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
print(A)
print('------------------')
print(T * X)
print('------------------')
print(M)
실행하다 보니까 이런 느낌이에요.[0 1 2]
------------------
[[0 0 0]
[0 1 2]
[0 2 4]]
------------------
[[ 1. +0.j 1. +0.j 1. +0.j ]
[ 1. +0.j -0.5-0.8660254j -0.5+0.8660254j]
[ 1. +0.j -0.5+0.8660254j -0.5-0.8660254j]]
T * X
N×N의 배열, (i, j)
의 요소(T * X)[i][j]
는 ${2^i×2^j}달러입니다.
그리고 ${M=e^{-i\racc{2\piTX}{N}의 나머지 부분M
을 계산합니다.↓ 여기 부분M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
실험
변환원이 되는 파형y
이 필요하기 때문에 적당히 인의 합성파로 제작한다.import numpy as np
import matplotlib.pyplot as plt
import dft
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
이런 느낌.
이산 부립엽 변환의 실현
샘플 수dft_matrix
를 다음 생성된 함수에 전달하여 변환 행렬N
을 얻습니다.
변환 매트릭스M
를 사용하는 매트릭스 계산에서 변환M
.행렬 연산은numbyy
이기 때문에 사용합니다.# 変換行列
N = len(y)
M = dft.dft_matrix(N)
# 波形 ⇒ M ⇒ 周波数表現
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
변환 결과
이어서 반변환을 진행하는데 이때 M의 반행렬을 구해야 한다.
역 행렬 변환도 numbynumpy.dot
이기 때문에 사용합니다.
그리고 변환된 numpy.linalg.inv
를 이전과 같은 요령에 따라 반변환한다.결과를 원래의 파형과 비교해 보자.inv_M = np.linalg.inv(M)
# 周波数表現 ⇒ -M ⇒ 波形
yd = np.dot(fy, inv_M)
print('元波形')
plt.plot(x, y)
plt.show()
print('逆変換後')
plt.plot(yd.real)
plt.show()
너무 완벽해(·)ω・)b
최후
dft를 묻고 바로 이동하는 코드를 거기에 두세요.(numby와 matplotlib이 없을 때는 pip로 살짝 넣으세요)import cmath
import numpy as np
import matplotlib.pyplot as plt
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
# 元波形生成部
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
# 変換行列の作成と変換
M = dft_matrix(len(y))
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
# 逆変換行列の作成と逆変換
inv_M = np.linalg.inv(M)
yd = np.dot(fy, inv_M)
print('逆変換後')
plt.plot(yd.real)
plt.show()
총결산
이산 부립엽 변환의 변환 행렬을 만들어 실제 변환과 반변환이 가능하다는 것을 증명했다.
결과:재미있다ρ(・ω・)
Reference
이 문제에 관하여(이산 부립엽 변환의 실현: 변환 매트릭스 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sai-sui/items/8b7c901b8fec891f9240
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
import cmath
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
N = 3
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
print(A)
print('------------------')
print(T * X)
print('------------------')
print(M)
[0 1 2]
------------------
[[0 0 0]
[0 1 2]
[0 2 4]]
------------------
[[ 1. +0.j 1. +0.j 1. +0.j ]
[ 1. +0.j -0.5-0.8660254j -0.5+0.8660254j]
[ 1. +0.j -0.5+0.8660254j -0.5-0.8660254j]]
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
변환원이 되는 파형
y
이 필요하기 때문에 적당히 인의 합성파로 제작한다.import numpy as np
import matplotlib.pyplot as plt
import dft
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
이런 느낌.이산 부립엽 변환의 실현
샘플 수
dft_matrix
를 다음 생성된 함수에 전달하여 변환 행렬N
을 얻습니다.변환 매트릭스
M
를 사용하는 매트릭스 계산에서 변환M
.행렬 연산은numbyy
이기 때문에 사용합니다.# 変換行列
N = len(y)
M = dft.dft_matrix(N)
# 波形 ⇒ M ⇒ 周波数表現
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
변환 결과이어서 반변환을 진행하는데 이때 M의 반행렬을 구해야 한다.
역 행렬 변환도 numby
numpy.dot
이기 때문에 사용합니다.그리고 변환된
numpy.linalg.inv
를 이전과 같은 요령에 따라 반변환한다.결과를 원래의 파형과 비교해 보자.inv_M = np.linalg.inv(M)
# 周波数表現 ⇒ -M ⇒ 波形
yd = np.dot(fy, inv_M)
print('元波形')
plt.plot(x, y)
plt.show()
print('逆変換後')
plt.plot(yd.real)
plt.show()
너무 완벽해(·)ω・)b최후
dft를 묻고 바로 이동하는 코드를 거기에 두세요.(numby와 matplotlib이 없을 때는 pip로 살짝 넣으세요)import cmath
import numpy as np
import matplotlib.pyplot as plt
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
# 元波形生成部
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
# 変換行列の作成と変換
M = dft_matrix(len(y))
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
# 逆変換行列の作成と逆変換
inv_M = np.linalg.inv(M)
yd = np.dot(fy, inv_M)
print('逆変換後')
plt.plot(yd.real)
plt.show()
총결산
이산 부립엽 변환의 변환 행렬을 만들어 실제 변환과 반변환이 가능하다는 것을 증명했다.
결과:재미있다ρ(・ω・)
Reference
이 문제에 관하여(이산 부립엽 변환의 실현: 변환 매트릭스 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sai-sui/items/8b7c901b8fec891f9240
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import cmath
import numpy as np
import matplotlib.pyplot as plt
def dft_matrix(N):
A = np.arange(N)
T = A.reshape(1, -1)
X = A.reshape(-1, 1)
M = cmath.e**(-1j * 2 * cmath.pi * T * X / N)
return M
# 元波形生成部
x = np.linspace(-1, 1, 200)
y = np.sin(2 * np.pi * x) + np.sin(2 * np.pi * 2.5 * x)
print('元波形')
plt.plot(x, y)
plt.show()
# 変換行列の作成と変換
M = dft_matrix(len(y))
fy = np.dot(y, M)
print('変換後:実部')
plt.plot(fy.real)
plt.show()
print('変換後:虚部')
plt.plot(fy.imag)
plt.show()
# 逆変換行列の作成と逆変換
inv_M = np.linalg.inv(M)
yd = np.dot(fy, inv_M)
print('逆変換後')
plt.plot(yd.real)
plt.show()
이산 부립엽 변환의 변환 행렬을 만들어 실제 변환과 반변환이 가능하다는 것을 증명했다.
결과:재미있다ρ(・ω・)
Reference
이 문제에 관하여(이산 부립엽 변환의 실현: 변환 매트릭스 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sai-sui/items/8b7c901b8fec891f9240텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)