基于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()
相关推荐
编码者卢布8 小时前
【App Service 】WebJobs 多实例实验:谁在运行,什么时候运行?
开发语言·python
kaixin_learn_qt_ing8 小时前
Qt抽屉窗体实现demo
开发语言·qt
quantdash_cc8 小时前
Python 获取实时行情后如何进行批量筛选?从全市场快照到策略候选池
开发语言·python·数据分析·量化交易·股票数据·quantdash
论文复现现场8 小时前
论文复现看到“RTX 3090 or higher”:显存、CUDA、batch size 与 OOM 怎么判断?
开发语言·pytorch·batch·cuda·rtx3090
智鸟科技GemeOpen开发者智能设备8 小时前
GemeOpen 智能音箱 GSSM0B - 播放控制(Java示例)
java·开发语言·智能音箱
小蜗 strong8 小时前
和电脑猜拳(随机程序应用)
服务器·前端·python
m0_380743879 小时前
PHP 8.3 接口返回数据为空怎么排查
开发语言·php
谢亮_vipxieliang9 小时前
Java 21 新特性实战:Record、Sealed、模式匹配
java·开发语言
华研前沿标杆游学9 小时前
企业标杆游学|走进东莞OPPO总部✨探秘智造与品牌出海
python
霸道流氓气质9 小时前
LLM 应用限流与熔断机制完全指南:从多层防护架构到Java生产级弹性实战
java·开发语言·架构