提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文介绍了信号上的一些处理也就是对波的一些处理如地震波,电磁波,地磁波、声波等一系列问题的处理及信号提取加分解。
一、前期准备工作之数据自动读取
- 以下代码是实现波形数据也就是一维数据的自动读取
- 以下是批次读取文件数据的代码
python
import os
import glob
import numpy as np
import matplotlib.pyplot as plt
import pywt
from scipy.signal import spectrogram
from scipy.io import wavfile
a = list(np.linspace(0,86401,10000))
def read_txt_files(folder_path):
txt_files = glob.glob(os.path.join(folder_path, "*.dat")) # 获取文件夹中所有的txt文件路径
for file_path in txt_files:
with open(file_path, 'r') as file:
lines = file.readlines()
waveform_data = []
# 遍历每一行数据
for line in lines:
# 去除行末尾的换行符
line = line.strip()
line = line.split(' ')
# 将字符串类型的数据转换为浮点数,并添加到列表中
waveform_data.append(line)
# 调用函数并传入文件夹路径
folder_path = r"F:\wave\data"
read_txt_files(folder_path)
二、前期准备工作之信号分解(小波分解)
- 小波分解能将特定频率范围内的波数据分解出来存储到小波系数当中
- 小波重构能将小波系数在转回到波数据
python
# 设置小波类型和分解层数
wavelet = 'db4'
level = 16
signal = wave_data_H
# 进行小波分解
coeffs = pywt.wavedec(signal, wavelet, level=level)
# 设置要保留的频率范围
desired_freq_range = (0.5, 35)
# 对每个频率范围内的系数进行处理
for i in range(1, len(coeffs)):
# 获取当前频率范围内的系数
current_coeffs = coeffs[i]
# 将不在目标频率范围内的系数置零
current_coeffs[np.abs(current_coeffs) < desired_freq_range[0]] = 0
current_coeffs[np.abs(current_coeffs) > desired_freq_range[1]] = 0
# current_coeffs[:] = 0
# 更新系数
coeffs[i] = current_coeffs
# 重构信号
reconstructed_signal = pywt.waverec(coeffs, wavelet)
三、前期准备工作之数据可视化(波形图展示)
- 波形图是一种能很好展示波数据频率的一种可视化方式
python
plt.figure(figsize=(13, 7))
plt.plot(t, reconstructed_signal)
plt.title('Reconstructed Signal')
plt.xlim(0,86400)
plt.xticks(np.arange(0,86401,3600),np.arange(0,86401,3600),fontsize=8)
#plt.savefig(r"F:\wave\data_image" + file_name + ".jpg")
plt.show()
四、总代码合并展示
python
import os
import glob
import numpy as np
import matplotlib.pyplot as plt
import pywt
from scipy.signal import spectrogram
from scipy.io import wavfile
a = list(np.linspace(0,86401,10000))
def read_txt_files(folder_path):
txt_files = glob.glob(os.path.join(folder_path, "*.dat")) # 获取文件夹中所有的txt文件路径
for file_path in txt_files:
with open(file_path, 'r') as file:
lines = file.readlines()
waveform_data = []
# 遍历每一行数据
for line in lines:
# 去除行末尾的换行符
line = line.strip()
line = line.split(' ')
# 将字符串类型的数据转换为浮点数,并添加到列表中
waveform_data.append(line)
# 打印提取的波形数据
wave_data = waveform_data[0][9:]
wave_data_H = []
for i in range(len(wave_data) // 4):
wave_data_H.append(wave_data[i * 4])
wave_data_H = np.array(wave_data_H).astype(np.float32)
# 设置小波类型和分解层数
wavelet = 'db4'
level = 16
signal = wave_data_H
# 进行小波分解
coeffs = pywt.wavedec(signal, wavelet, level=level)
# 设置要保留的频率范围
desired_freq_range = (0.5, 35)
# 对每个频率范围内的系数进行处理
for i in range(1, len(coeffs)):
# 获取当前频率范围内的系数
current_coeffs = coeffs[i]
# 将不在目标频率范围内的系数置零
current_coeffs[np.abs(current_coeffs) < desired_freq_range[0]] = 0
current_coeffs[np.abs(current_coeffs) > desired_freq_range[1]] = 0
# current_coeffs[:] = 0
# 更新系数
coeffs[i] = current_coeffs
# 重构信号
reconstructed_signal = pywt.waverec(coeffs, wavelet)
t = np.linspace(0, 86400, num=86400, endpoint=False)
sample_rate = 44100 # 设置采样率
file_name = "\\" + file_path.split('\\')[-1].split('.')[0]
plt.figure(figsize=(13, 7))
plt.plot(t, reconstructed_signal)
plt.title('Reconstructed Signal')
plt.xlim(0,86400)
plt.xticks(np.arange(0,86401,3600),np.arange(0,86401,3600),fontsize=8)
plt.savefig(r"F:\wave\data_image" + file_name + ".jpg")
# plt.show()
# 调用函数并传入文件夹路径
folder_path = r"F:\wave\data"
read_txt_files(folder_path)
总结
以上的三大部分单拿出一个都可以去干别的,如文件自动化处理、信号处理和可视化图表,合起来用就可以将n个数据分解并保存到图片当中,威力无穷。