본문 바로가기
Brain Engineering/MNE

Signal Processing : Complex Numbers

by goatlab 2022. 4. 4.
728x90
반응형
SMALL

Complex Numbers

 

공학에서 시간 불변 진폭 (A), 각주파수 (ω) 및 초기 위상 (φ)을 갖는 사인파 신호는 페이저 (phasor)라고 하는 복소수로 나타낼 수 있다는 것이다. (위상 벡터의 약자)

 

  • 진폭 (A) : 신호 중간 값에서 최대값까지의 거리
  • 각주파수 (w) : 주파수로 변환하지만 신호가 주기를 얼마나 빨리 통과하는지 나타낸다. 주파수에서 계산하는 것은 간단하다.
  • 주파수 (f) : 신호가 중간 값을 중심으로 진동하는 빈도
  • 위상 : 신호 주기의 임의 지점과 관련된 지연, 일반적으로 다른 신호의 시작 지점

 

오일러의 공식을 사용한다. 페이저는 시간 변화에 대한 참조 없이 작성되지만 다른 신호에 대해서만 작성되므로 일반적으로 다음과 같이 작성된다.

 

 

The Imaginary Number

 

 

Representation

 

  • rectangular or cartesian : 숫자를 실수 부분과 허수 부분으로 분해하고 각각 숫자의 실수 부분과 허수 부분으로 표현
  • 극좌표 (polar) : 숫자는 여기서 크기 (r) (또는 계수)는 원점 (O)에서 점까지의 거리이고 인수는 원점에서 z까지의 선과 양의 실수 축 사이의 각도를 설명한다. 극좌표 표현이 위의 페이저와 매우 유사한 표현을 사용한다는 것을 알아차렸을 수도 있다. 이것은 주기의 지연을 나타내므로 페이저의 위상과 같다. 크기는 실수 (또는 허수) 축에 투영할 수 있는 최대값을 나타내며 페이저의 진폭과 동일하다.
## load libraries
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
import cmath as cm
from scipy import signal as sps
from IPython.display import HTML

# Prepare a complexe plane plot (aka argand diagram)
fig, ax = plt.subplots(1,2,figsize=(12,4),sharey='row',gridspec_kw={'width_ratios': [1, 2]})
ax[0].axis([-1,1,-1,1])
ax[0].spines['left'].set_position('center')
ax[0].spines['bottom'].set_position('center')
ax[0].spines['right'].set_color('none')
ax[0].spines['top'].set_color('none')
ax[0].add_artist(plt.Circle([0,0],1,color='k', fill=False))

## define a number and represent it as a vector on the complex plane
# pick an arbitrary phase
phi1 = 0
z1 = complex(np.cos(phi1),np.sin(phi1))
l1, = ax[0].plot([0,z1.real],[0,z1.imag],marker='o');
phi2 = np.pi/4 # 45° expressed in radians
z2 = complex(np.cos(phi2),np.sin(phi2))
l2, = ax[0].plot([0,z2.real],[0,z2.imag],marker='o');

## Let's plot the signals as a time series next to it
# Pick an arbitrary frequency
f = 50;
t = np.linspace(0,1/f,20) # 1/f, aka the periode of the signal (T), is one complete cycle.
x1 = np.sin(2*np.pi*f*t+phi1)
x2 = np.sin(2*np.pi*f*t+phi2)
ax[1].axis([0,1/f,-1,1])
ax[1].spines['bottom'].set_position('center')
ax[1].spines['right'].set_color('none')
ax[1].spines['top'].set_color('none')
plt.xlabel('t [s]', horizontalalignment='right', x=1)

l3, = ax[1].plot(t,x1)
l4, = ax[1].plot(t,x2);​

## Let's animate this
# using the same amount of samples for phi, t and the animation frequency will make things much simpler
Nframes = 20;
phi = np.linspace(0,2*np.pi,Nframes)
t = np.linspace(0,1/f,Nframes)
# recompute x1 and x2 with the new sample rate
x1 = np.sin(2*np.pi*f*t+phi1)
x2 = np.sin(2*np.pi*f*t+phi2)

def animate(i):
    z1 = complex(np.cos(phi[i]+phi1),np.sin(phi[i]+phi1))
    z2 = complex(np.cos(phi[i]+phi2),np.sin(phi[i]+phi2))
    l1.set_data([0,z1.real],[0,z1.imag])
    l2.set_data([0,z2.real],[0,z2.imag])
    l3.set_data(t[0:i],x1[0:i])
    l4.set_data(t[0:i],x2[0:i])

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=Nframes)

HTML(ani.to_jshtml())

 

Operations with complex numbers

 

복소수에는 많은 수학적 관계가 있다. 더하기와 곱하기 (빼기와 나눗셈은 어떤 면에서는 각각의 특수한 경우). 이것이 복소수 (직교 및 극좌표)에 대한 두 표현이 모두 사용되는 이유 중 하나이다. 데카르트 표현에서 더하기 (또는 빼기)가 매우 쉽고 극 표현에서 곱하기 (또는 나누기)가 매우 쉽다.

 

https://github.com/aath0/AlgorithmsNeuroscience/blob/master/Tutorials/ComplexNumbers.ipynb

 

GitHub - aath0/AlgorithmsNeuroscience: Open Educational Resources for Algorithmic Decision-Making in Neuroscience

Open Educational Resources for Algorithmic Decision-Making in Neuroscience - GitHub - aath0/AlgorithmsNeuroscience: Open Educational Resources for Algorithmic Decision-Making in Neuroscience

github.com

 

728x90
반응형
LIST