반응형

안녕하세요. 

 

오늘은 파이썬으로 신호처리의 기본인 신호의 시간영역과 주파수 영역에 대해 알아보겠습니다. 

 

우선 제가 진행하고 있는 프로젝트의 신호를 사용하겠습니다. 

 

CSV로 저장된 신호(시간영역)파일

우선, 저 위 데이터를 설명하겠습니다. 

 

AVR의 adc(analog to digital converter)를 거친 데이터로 0에서 1023의 사이의 출력값을 가집니다.


https://coding-yoon.tistory.com/13?category=823570

 

PWM으로 아날로그 값을 출력해보자! 1편

안녕하세요. 오늘은 PWM에 대해 알아보도록 하겠습니다. 아두이노의 핀에는 I/O(input/output)핀의 종류 3가지가 있습니다. 1. Analog Input 2. Digital Input 3. Digital Output 하나 부족해보이지 않나요? 바로..

coding-yoon.tistory.com

위 데이터를 설명하려고 하니, 옛날에 적어놓은 글이 있었습니다. 위 글을 참고하시면 좋을 것 같습니다.

 

( 위 링크의 글에 이상한 점이 있는데 혹시 찾으셨나요?? 제가 다시 한 번 읽어보니 샘플링(양자화)하여 부호화!! 이렇게 적혀 있습니다. 정확히 말하자면 샘플링(sampling)은 시간으로 쪼갠 것이며, 진폭으로 쪼갠 것이 양자화 입니다. 

그러니 0 ~ 5v를 0 ~ 1023(10bits)로 양자화했다는 것이 정확한 표현입니다.)

 

시간 & 진폭 디지털 데이터(0 ~ 1023)

 

위 데이터는 시간에 따른 소리 데이터입니다. 아무 전처리를 거치지 않는 시간 & 진폭 디지털 데이터입니다.

 

다시 의미가 있는 아날로그화시켜주도록 합시다. 다만, 제가 sampling rate를 몇으로 설정했는지 지금은 기억이 나지 않아 시간은 그대로 두고, 진폭을 아날로그화시켜주도록 하겠습니다. 

 

analog_data = digital_data / 1024 * 5.0(v)

 

디지털 데이터에 양자화시켜준 bit로 나눠주고, 인가한 전압을 곱해주면 됩니다. 

 

시간 & 전압 아날로그 데이터(0 ~ 5V)

대부분 사람들은 시간 영역으로 보는 데이터를 보고 분석합니다. ex) 시간에 따른 전압, 주식 등등

 

하지만, 공학을 배우는 사람들은 시간 영역뿐만 아니라 주파수 영역을 알아야 합니다. 

 

주파수 영역은 언제 사용될까요?

 

가장 대표적인 예시 중 하나가 필터일 것입니다. 

만약, 제가 위 데이터를 Low Pass Filter를 사용해서 100Hz미만의 데이터만 추출하였고(sample rate를 알고 있다는 가정하에), 그것을 확인하고 싶다면 어떻게 해야할까요? 어느정도 눈으로 고주파가 잘렸구나는 시간영역에서 대략적으로 알 수 는 있지만 정확히 알 수 없습니다. 그 때 사용되는 영역이 주파수 영역입니다. 

 

시간 신호를 주파수 영역으로 변환하고 싶다면, 푸리에 급수, 푸리에 변환을 알아야 하지만, 그건 파이썬에게 맡겨 둡시다.

 

파이썬을 numpy를 사용해서 바로 변환해보도록 하겠습니다.  한 줄이면 가능합니다. 

import numpy as np

fft = np.fft.fft(data) / len(data)
fft_abs = abs(fft)

np.fft.fft에 나온 값을 왜 abs(절댓값)을 씌운 이유는 복소수가 들어있기 때문입니다. 바로 plot시켜 보겠습니다.

import matplotlib.pyplot as plt

plt.title("raw data - frequency domain")
plt.stem(fft_abs)
plt.show()

주파수 & 전압 아날로그 주파수 영역

그림이 무언가 잘못된 것 같습니다. 

 

0Hz에서 2.5가 우뚝 서있고, 나머지 주파수는 보이지 않습니다. 어떻게 해야할까요?

 

직류 성분을 제거하면 됩니다. 지금 현재 데이터는 2.5V를 기준으로 값이 흐르고 있습니다.

그 말은 즉슨 2.5V의 직류 성분을 제거하면 교류 성분만 남게 된다는 것입니다. 바로 2.5V를 빼숩니다.

 

analog_data = digital_data / 1024 * 5.0(v) - 2.5(v)

 

그리고 다시 그려줍시다.

직류 성분을 제거한 주파수 & 전압 아날로그 주파수 영역

위처럼 주파수 영역으로 변경하면, 어떤 대역의 주파수가 많고 적은지는 정확히 알 수 있게 됩니다. 

728x90
반응형
반응형

안녕하세요. 

 

pandas_datareader을 이용해서 데이터 처리를 하기 위해 아래 문구처럼 에러문이 뜨는 경우가 있습니다. 

 

FutureWarning: pandas.util.testing is deprecated. Use the functions in the public 
API at pandas.testing instead. from pandas.util.testing import assert_frame_equal

아래 에러문이 뜨더라도 실제 코딩하는데는 아무 문제 없습니다. 

 

위 에러문은 pandas.util.testing 에서 더 이상 사용되지 않기 때문에 뜹니다. 

 

대신, pandas.testing에서 사용할 수 있으니 수정하라는 권고문 같은 정도입니다. 

 

실행될 때마다 에러문이 발생하면 기분이 별로 좋지 않으니 에러문이 뜨지 않도록 수정해주겠습니다. 

 

에러문 옆을 보면 pandas_datareader/compat/__init__.py에서 7번 째 줄에서 해당 에러문이 발생하는 것을 알 수 있습니다.

 

클릭해서 해당 파일에 들어가기
해당 7번째 줄

7: pandas.util.testing을 pandas.testing으로 바꿔주면 됩니다. 

 

수정

위 처럼 수정해주시고 실행시켜 보시면 에러문은 뜨지 않습니다. 

728x90
반응형
반응형

 

 

안녕하세요. 

 

오늘은 Python에 내장되어 있는 threading과 PyQt5dml QThread의 차이점에 대해 이야기하겠습니다.

 

threading 쓰레드 역할을하고, QThread도 쓰레드 역할을 합니다.

 

하지만 분명히 둘의 차이가 있습니다. 

 

우선, 쓰레드에 대해 애매하시다면 아래 글을 보시면 됩니다.

 

https://coding-yoon.tistory.com/45

 

[파이썬 실습] PyQt5 : QThread를 사용해 응답 없음 방지 & 여러 동작하기

안녕하세요. 프로그래밍을 하면서 여러 동작을 하기 위해서는 쓰레드란 개념을 알아야 합니다. 우선, 작업관리자를 한 번 보겠습니다. CPU는 한 번에 한 가지의 동작밖에 하지 못합니다. 하지만 G(10의 9제곱)단..

coding-yoon.tistory.com

저번 글과 똑같이 QThread에 구현하겠습니다. 

#쓰레드를 선언한 간단한 예제
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


#쓰레드 선언
class Thread1(QThread):
    #parent = MainWidget을 상속 받음.
    def __init__(self, parent=None):
        super().__init__(parent)
    def run(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)

        self.resize(200,200)
        self.setLayout(vbox)

    def increaseNumber(self):
        x = Thread1(self)
        x.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

 

 

 

이번엔 Python threading을 이용해 쓰레드를 구현하겠습니다.

#threading을 이용해 쓰레드 구현
from PyQt5.QtWidgets import *
import threading
import time
import sys


#쓰레드 선언
class Thread1(threading.Thread):
    def __init__(self, parent=None):
        super().__init__(parent)
    def run(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)

        self.resize(200,200)
        self.setLayout(vbox)

    def increaseNumber(self):
        x = Thread1()
        x.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

 

 

두 개의 차이점을 아시겠나요?

 

threading은 gui가 종료되어도 하나의 쓰레드로서 자신의 일을 마칠 때까지 쓰레드가 돌아가는 반면에,

 

QThread는 gui가 꺼지면, 같이 쓰레드가 종료됩니다. 

728x90
반응형
반응형

안녕하세요.

 

프로그래밍을 하면서 여러 동작을 하기 위해서는 쓰레드란 개념을 알아야 합니다. 

 

우선, 작업관리자를 한 번 보겠습니다.

 

작업관리자

CPU는 한 번에 한 가지의 동작밖에 하지 못합니다. 하지만 G(10의 9제곱)단위로 동작합니다.

 

작업관리자를 확인하면 CPU는 하나인 반면, 프로세스는 184개가 1958개의 쓰레드를 통해 동작하는 것을 확인할 수 있습니다.

 

CPU는 시간, 우선순위 등 여러가지 방식으로 할당합니다.

 

예를 들어,

 

간단한 쓰레드 구조

이런식으로 쓰레드 1번 수행, 2번 수행, 다음 3번 수행하면서 반복합니다.

 

그러나 그 속도가 굉장히 빨라 사람들이 사용하는데 알아차리지 못합니다. 

 

#쓰레드를 선언하지 않은 예제
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)
		
        self.resize(200, 200)
        self.setLayout(vbox)
	
    #버튼을 누르면 1씩 증가하는 함수
    def increaseNumber(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

쓰레드를 선언하지 않고 버튼을 누르면 0부터 9까지 수행하는 간단한 PyQt5를 예시를 보겠습니다.

 

코딩에서는 쓰레드를 선언하지 않았지만, 사실 여기에는 쓰레드가 사용되고 있습니다. 

 

바로 GUI에서 사용되고 있습니다. 

 

이 프로그램을 돌려 보시면, 버튼을 누르고 함수가 수행을 마칠 때까지 GUI는 동작하지 않습니다.

 

아마 응답하지 않는다고 경고창이 뜰 것입니다. 

 

그 이유는 이 프로그램에 할당된 쓰레드는 하나이고, 이미 함수를 동작하는데 쓰레드가 사용되고 있으니, GUI는 그 동안 동작하지 않습니다. 

 

그렇다면 쓰레드를 한 번 사용해서 GUI도 움직이고, 함수도 동작하는 예제를 작성해보겠습니다.

#쓰레드를 선언한 간단한 예제
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


#쓰레드 선언
class Thread1(QThread):
    #parent = MainWidget을 상속 받음.
    def __init__(self, parent):
        super().__init__(parent)
    def run(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)

        self.resize(200,200)
        self.setLayout(vbox)

    def increaseNumber(self):
        x = Thread1(self)
        x.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

QThread를 선언하고 자신이 실행시키고자 하는 함수를 run에 작성해줍니다. 

 

그리고 선언한 쓰레드 클레스를 객체를 생성해주고 객체를 start해주면 간단하게 해결됩니다.

 

728x90
반응형
반응형

안녕하세요

 

오늘은 파이썬 Numpy를 설명하겠습니다. 

 

Numpy 중에서도 제가 자주 쓰는 내용 위주로 가겠습니다.

 

1. import

import numpy as np

2.  내용 삽입

list_test = []
for i in range(5000*700):
	list_test = np.append(list_test, i)

list_test라는 빈 list가 생성됩니다.

 

for문을 타고 list_test에 차례대로 0부터 5000*700-1까지 값이 들어갑니다.

 

append함수를 사용하면 list_test는 1차 배열로서 기능합니다. 

 

만약 데이터셋이 5000개가 존재하고 하나의 데이터 셋안에 700개가 들어있다면,

 

append함수는 길이가 5000 * 700개인 1차 numpy가 생성됩니다.

 

그렇다면 다시 list_test를 재정렬을 시켜줄 필요가 있습니다. 

 

3. 재정렬

list_test.reshape(5000, 700)

이렇게 reshape해주면 5000x700의 2차 numpy가 생성됩니다.

 

reshape함수를 사용하면 몇 차가 되었든 데이터를 자신이 원하는 형태로 다듬을 수 있습니다. 

 

4. 크기 확인

list_test.shape()

항상 데이터 크기를 확인을 해주어야 합니다.

 

이 정도만 알아도 기본적인 데이터를 처리할 수 있습니다.

 

+, - , * , / , 제곱근, cos 등 당연히 계산이 가능합니다. 

 

의외로 인공지능 모델을 만드는 과정 중에서 데이터 처리가 굉장히 중요합니다. 

 

어떤 데이터를 쓰고, 데이터를 어떻게 자르냐에 따라 모델의 성능의 결과가 다르게 나옵니다.

 

728x90
반응형

+ Recent posts