利用声阵列设备对变电设备进行声纹检测时,收到的文件往往时tdms文件,使用常规的音视频播放工具无法正常播放,也无法查看文件信息,这时就需要利用一些工具进行特殊处理,将其转换为wav文件,然后再进行音频处理。
1 TDMS文件
TDMS(Technical Data Management Streaming)文件是NI主推的一种二进制记录文件,它兼顾了高速、易存取和方便等多种优势,能够在NI的各种数据分析或挖掘软件之间进行无缝交互,也能够提供一系列API函数供其它应用程序调用。
TDMS的逻辑结构有三层:第一层为文件(File),第二层为通道组(Channel Groups),最后是通道(Channels),每一个层次上都可以附加特定的属性(Properties)。
2 利用excel查看tdms文件数据
首先,我们可以使用excel读取tdms文件,使用excel读取tdms文件时需要安装ni-tdm-excel-addin_21.3.0_offline.iso插件,然后打开excel时工具栏会出现加载项,选择加载项打开需要读取的tdms文件即可。
tdms文件过大时需要缓冲一段时间,耐心等待缓冲完成,打开后结构如下:
3 python读取
需要安装nptdms插件,在终端执行命令pip install npTDMS即可。
3.1 首先引入所需第三方库
import matplotlib.pyplot as plt
from nptdms import TdmsFile
import numpy as np
import pandas as pd
3.2 创建TdmsFile对象,并使用open读取文件元数据
TDMS文件需要一层一层读取,先读取文件,然后读取组名,之后用组名作为索引读取通道名,最后可以用通道名作为索引读取通道数据。
with TdmsFile.open(r'文件的路径') as tdms_file:
for group in tdms_file.groups(): # TdmsFile可以按组名索引来访问TDMS文件中的组,使用groups()方法直接访问所有组
group_name = group.name
print(group_name)
for channel in group.channels(): # TdmsGroup 可以通过通道名称来索引来访问这个组中的一个通道,使用 channels()方法直接访问所有通道
channel_name = channel.name
print(channel_name)
3.3 读取通道
channel = tdms_file[group_name][channel_name] # 根据索引读取通道
all_channel_data = channel[:] # 将此通道中所有的数据作为numpy数组获取
num = np.array(all_channel_data)
df = pd.DataFrame(num) # 将numpy数组中的数据转换成DataFrame并输出
print(df[:][1:])
print(df.shape) # 维度查看
3.4 用Matplotlib将该数据进行可视化
part_channel_data = channel[1:100] # 取部分数据进行分析,这里取的是1到100的数据
a = np.array(part_channel_data) # 用数据大小作为y轴
x = np.arange(1, 100) # 定义x轴范围
plt.figure(figsize = (20, 8), dpi = 80) # 设置界面大小
plt.plot(x, a, ‘k’) # 设置x,y轴和曲线的颜色,k为黑色
plt.xlabel(‘intensity’) # 设置x标签
plt.xticks(x[::10]) # 设置x轴每个下标的间隔
plt.title('name') # 设置标题名称
plt.show() # 输出数据图像
3.5 将音频数据保存为wav格式
data = num
framerate = 48077
nchannels = 1
sampwidth = 2
name = "./"+ channel_name +".wav"
save_wav(data, framerate, nchannels, sampwidth, name)
执行以上操作可将tdms文件转换为wav文件,后续即可进行wav音频文件的数据处理