본문 바로가기

Programming Language/Python_library

2KHz의 sin파 PyQt5로 구현

320x100

무한히 반복되는 SIN파의 형태에 대하여 파이썬 - PyQt5로 구현했습니다.

 

주파수 : 2khz

진폭 : 5v

지속시간 : 0.001초

샘플링 주파수 : 80KHz

 

위 단위를 전제합니다.

 

목적은 그래프 반환되는 속도와 최적화에 대한 방향 설정입니다.

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import QChart, QChartView, QLineSeries
from PyQt5.QtCore import *
import numpy as np


import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene
from PyQt5.QtChart import QChart, QChartView, QLineSeries, QValueAxis

class SinWaveChart(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("2KHz Sin Wave Chart")
        self.setGeometry(100, 100, 1900, 1300)
        
        # 파라미터 설정
        self.frequency = 2000  # 주파수 2kHz
        self.amplitude = 5.0  # 진폭
        self.duration = 0.001   # 파형의 지속 시간 (0.001초)
        self.sampling_rate = 80000  # 샘플링 주파수 (80kHz)
        
        self.t = np.linspace(0, self.duration, int(self.sampling_rate * self.duration), endpoint=False)
        self.index = 0  # 현재 인덱스
        self.sin_wave = self.amplitude * np.sin(2 * np.pi * self.frequency * self.t)
        
        series = QLineSeries()
        for i in range(len(self.t)):
            series.append(self.t[i], self.sin_wave[i])
        chart = QChart()
        chart.setTitle("2KHz Sin Wave")
        chart.addSeries(series)
        
        self.axisX = QValueAxis( )
        self.axisX.setMax(10)
        self.axisX.setMin(0)
        self.axisX.setLabelFormat("%.1f")  # 눈금 레이블 형식 설정
        self.axisX.setTickCount(11)  # 눈금의 개수를 11로 설정
        
        self.axisY = QValueAxis( )
        self.axisY.setMax(10)
        self.axisY.setMin(-10)
        self.axisY.setLabelFormat("%.1f")  # 눈금 레이블 형식 설정
        self.axisY.setTickCount(11)  # 눈금의 개수를 11로 설정
        
        self.chartView = QChartView(chart)
        self.chartView.setRenderHint(QPainter.Antialiasing)
        chart.addAxis(self.axisX, Qt.AlignBottom)  # x축을 아래에 추가
        chart.addAxis(self.axisY, Qt.AlignLeft)  # y축을 왼쪽에 추가
        
        self.setCentralWidget(self.chartView)
        self.timer = QBasicTimer()
        self.timer.start(10, self)  # 10ms마다 타이머 이벤트 발생

        self.show()

        
    def timerEvent(self, event):

        if event.timerId() == self.timer.timerId():
            # 새로운 데이터 포인트 생성
            sin_wave = self.amplitude * np.sin(2 * np.pi * self.frequency * self.t - self.index * 0.1)
            self.index += 1

            # 데이터 포인트를 그래프에 추가
            series = self.chartView.chart().series()[0]
            series.clear()
            for i in range(len(self.t)):
                series.append(self.t[i], sin_wave[i])
        else:
            super().timerEvent(event)    
        

def main():
    app = QApplication(sys.argv)
    window = SinWaveChart()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

 

속도에 대한 문제

1) X축과 Y축값을 프린트 할 경우에 소요 발생

2) Duration 값이 큰 영향을 발생

 

- visual studio 2022에서의 실행예시 입니다.

 

(영상 기준 : 4초)

 

728x90