基于Pyqt5的正弦波信号分析界面

基于PyQt5的正弦波信号分析界面

简介

使用PyQt5界面生成一个正弦波 ,可以调整频率、振幅、采样频率、采样时间、还可以混合频率。

对正弦波可进行FFT傅里叶变换STFT短时傅里叶变换分析 ,并能够显示对应的图形。

可当作一个简单的信号处理界面,后续还可以添加IIR滤波器、FIR滤波器等。

复制代码
功能:
1、生成正弦波
2、FFT频域分析
3、STFT频域分析

1、效果图

复制代码
需要主体代码可以联系
"""
@contact: 微信 1257309054
@file: main_windows.py
@time: 2024/3/30 8:40
@author: LDC
"""

2、生成正弦波

示例代码:

python 复制代码
# -*- coding: utf-8 -*-

"""
@contact: 微信 1257309054
@file: main_windows.py
@time: 2024/3/30 8:40
@author: LDC
"""
import numpy as np
import sys
import matplotlib
import pyqtgraph
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator, QFont
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout
from scipy import signal
from windows import Ui_MainWindow

matplotlib.use("Qt5Agg")  # 声明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
matplotlib.rcParams['axes.unicode_minus'] = False  # 显示负号

def create_sin(self):
    # 生成正弦波
    # 设置采样率和持续时间
    sampling_rate = self.sampling_rate_edit_value  # 采样率 (每秒采样点数)
    duration = self.duration_edit_value  # 持续时间 (秒)

    # 设置正弦波的频率和振幅
    frequency = self.freq_edit_value  # 频率 (赫兹)
    amplitude = self.amp_edit_value  # 振幅

    # 生成时间序列
    t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False)

    # 生成正弦波采样数据
    samples = amplitude * np.sin(2 * np.pi * frequency * t)
    if self.is_mix:
        # 使用混合频率
        samples_mix = amplitude * np.sin(2 * np.pi * self.mix_freq_edit_value * t)
        # 合并信号
        samples = np.concatenate((samples, samples_mix))
        # samples = samples + samples_mix

    return t, samples

3、FFT傅里叶变换

示例代码:

python 复制代码
X = np.fft.fft(samples)  # 计算信号的FFT
freq = np.fft.fftfreq(len(samples), 1 / self.sampling_rate_edit_value)  # 计算对应的频率数组
mid = len(X) // 2  # 取正值
self.fft_p_show.setData(freq[:mid], np.abs(X)[:mid])  # 绘制FFT

4、STFT 短信傅里叶变换

python 复制代码
# 计算并绘制STFT的大小
fs = self.sampling_rate_edit_value
f, t, spectrum  = signal.stft(data, fs, nperseg=256, noverlap=128)

self.stft_canvas.figure.clear()  # 清空画布
ax = self.stft_fig.add_subplot(111)
self.stft_fig.subplots_adjust(left=None, bottom=0.2, right=None, top=None, wspace=None, hspace=None)
ax.cla()  # 删除原图,让画布上只有新的一次的图
ax.pcolormesh(t, f, np.abs(spectrum), vmin=0, vmax=0.1, shading='gouraud')
ax.set_title('STFT Magnitude')
ax.set_xlabel('time [sec]')
ax.set_ylabel('frequency [Hz]')
self.stft_canvas.draw()
相关推荐
CryptoPP16 分钟前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
树叶@17 分钟前
Python数据分析7
开发语言·python
wydaicls20 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
浠寒AI2 小时前
智能体模式篇(上)- 深入 ReAct:LangGraph构建能自主思考与行动的 AI
人工智能·python