如何应用25种一维数据转换二维图像的方法 ,怎样用于故障诊断,状态识别呢?
如何应用25种一维数据转换二维图像的方法,可方便结合深度学习
用于故障诊断,状态识别等。
声明:文章内代码仅供参考:
时频类:
- 梅尔频谱图Mel spectrogram
- 短时傅里叶变换short-time Fourier transform
- s变换S-transform
- 魏格纳分布Wigner-Ville Distribution
- 离散魏格纳分布Discrete Wigner-Ville Distribution
- 希尔伯特变换Hilbert-Huang Transform
- 连续小波变换Continuous wavelet transform
- 实小波变换Real wavelet transform
- 同步压缩变换Synchrosqueezing transform
- 小波同步压缩变换wavelet synchrosqueezed transform
- 小波二阶同步压缩变换wavelet second order synchrosqueezed transform
- 垂直二阶同步压缩变换vertical second-order synchrosqueezing
- 多尺度同步压缩变换Multisynchrosqueezing Transform
- 小波多尺度同步压缩变换Wavelet Multisynchrosqueezed Transform
- 局部最大同步压缩变换Local maximum synchrosqueezing transform 16. 时间重分配多同步压缩变换Time-reassigned Multisynchrosqueezing Transform
- 同步提取变换Synchroextracted transform
- 小波同步提取变换Wavelet Synchroextracted Transform
- 暂态提取变换transient-extracting transform
- 二阶暂态提取变换Second-order transient-extracting transform
时域转换类: - 格拉姆角和场Gramian angular summation field
- 格拉姆角差场Gramian angular difference field
- 递归图recurrence plots
- 相对位置矩阵Relative Position Matrix
25.图形差分场Motif Difference Field
*如何一键批量循环自动生成时频图像。
*滑动窗口划分原始数据,原始数据可生成多个样本。
为了实现从一维数据到二维图像的转换,以便于深度学习的应用,我们可以编写 MATLAB 代码来自动化这个过程。我们将涵盖你提到的所有时频类和时域转换类方法,并提供一个一键批量循环自动生成时频图像的功能。
项目概述
创建一个 MATLAB 脚本来处理一维数据并将其转换为多种类型的二维图像。这些图像可以用于故障诊断、状态识别等任务。以下是详细的步骤:
- 数据加载:加载原始的一维数据。
- 时频变换:实现各种时频变换方法。
- 时域变换:实现各种时域变换方法。
- 图像生成:将变换结果保存为图像文件。
- 批处理功能:支持批量处理多个样本。
数据结构
假设你的数据集包含多个一维信号文件,每个文件对应一个样本。例如:
data/
├── sample1.mat
├── sample2.mat
└── ...
每个 .mat
文件中包含一个名为 signal
的变量,存储一维信号数据。
MATLAB代码实现
主脚本 generate_images.m
[<title="Generate Images from 1D Data Using Various Transformations">]
% Generate Images from 1D Data Using Various Transformations
% This script loads 1D signals, applies various transformations, and saves the results as images.
clear;
clc;
% Configuration
data_folder = 'path/to/data'; % Path to the folder containing .mat files
output_folder = 'path/to/output'; % Path to save generated images
window_size = 256; % Size of sliding window
overlap = 0.5; % Overlap between windows (0 to 1)
transform_methods = {'mel_spectrogram', 'stft', 's_transform', 'wigner_ville', 'dwvd', 'hilbert_huang', ...
'cwt', 'rwt', 'synchrosqueezing', 'wsst', 'wsost', 'vsost', 'msst', 'wmsst', 'lmsst', ...
'trmsst', 'sext', 'wsext', 'tet', 'so_tet', 'gASF', 'gADF', 'rp', 'rpm', 'mdf'};
% Ensure output folder exists
if ~exist(output_folder, 'dir')
mkdir(output_folder);
end
% Get list of .mat files in the data folder
file_list = dir(fullfile(data_folder, '*.mat'));
num_files = length(file_list);
for i = 1:num_files
file_name = fullfile(data_folder, file_list(i).name);
load(file_name); % Load signal from .mat file
if isfield(base_workspace, 'signal')
signal = base_workspace.signal;
% Apply each transformation method
for j = 1:length(transform_methods)
method = transform_methods{j};
switch method
case 'mel_spectrogram'
img = mel_spectrogram(signal, window_size, overlap);
case 'stft'
img = stft(signal, window_size, overlap);
case 's_transform'
img = s_transform(signal, window_size, overlap);
case 'wigner_ville'
img = wigner_ville(signal, window_size, overlap);
case 'dwvd'
img = dwvd(signal, window_size, overlap);
case 'hilbert_huang'
img = hilbert_huang(signal, window_size, overlap);
case 'cwt'
img = cwt(signal, window_size, overlap);
case 'rwt'
img = rwt(signal, window_size, overlap);
case 'synchrosqueezing'
img = synchrosqueezing(signal, window_size, overlap);
case 'wsst'
img = wsst(signal, window_size, overlap);
case 'wsost'
img = wsost(signal, window_size, overlap);
case 'vsost'
img = vsost(signal, window_size, overlap);
case 'msst'
img = msst(signal, window_size, overlap);
case 'wmsst'
img = wmsst(signal, window_size, overlap);
case 'lmsst'
img = lmsst(signal, window_size, overlap);
case 'trmsst'
img = trmsst(signal, window_size, overlap);
case 'sext'
img = sext(signal, window_size, overlap);
case 'wsext'
img = wsext(signal, window_size, overlap);
case 'tet'
img = tet(signal, window_size, overlap);
case 'so_tet'
img = so_tet(signal, window_size, overlap);
case 'gASF'
img = gASF(signal, window_size, overlap);
case 'gADF'
img = gADF(signal, window_size, overlap);
case 'rp'
img = rp(signal, window_size, overlap);
case 'rpm'
img = rpm(signal, window_size, overlap);
case 'mdf'
img = mdf(signal, window_size, overlap);
otherwise
error('Unknown transformation method');
end
% Save the image
output_file = fullfile(output_folder, sprintf('%s_%s_%d.png', file_list(i).name, method, i));
imwrite(img, output_file);
end
else
warning('Signal variable not found in %s', file_name);
end
end
disp('Image generation complete.');
% Helper functions
function img = mel_spectrogram(signal, window_size, overlap)
fs = 1000; % Sampling frequency
nfft = nextpow2(window_size);
noverlap = round(overlap * window_size);
[S, f, t] = spectrogram(signal, window_size, noverlap, nfft, fs, 'yaxis');
S_dB = 20*log10(abs(S)+eps);
img = mat2gray(S_dB);
end
function img = stft(signal, window_size, overlap)
fs = 1000; % Sampling frequency
nfft = nextpow2(window_size);
noverlap = round(overlap * window_size);
[S, f, t] = spectrogram(signal, window_size, noverlap, nfft, fs, 'yaxis');
img = abs(S);
img = mat2gray(img);
end
function img = s_transform(signal, window_size, overlap)
fs = 1000; % Sampling frequency
a = linspace(-5, 5, 100);
b = linspace(-5, 5, 100);
[A, B] = meshgrid(a, b);
ST = zeros(size(A));
for k = 1:length(signal)
ST = ST + signal(k) * exp(-pi * ((A - k/fs).^2 + (B * fs).^2));
end
img = abs(ST);
img = mat2gray(img);
end
function img = wigner_ville(signal, window_size, overlap)
fs = 1000; % Sampling frequency
WVD = wv(signal, fs);
img = abs(WVD);
img = mat2gray(img);
end
function img = dwvd(signal, window_size, overlap)
fs = 1000; % Sampling frequency
DWVD = dwv(signal, fs);
img = abs(DWVD);
img = mat2gray(img);
end
function img = hilbert_huang(signal, window_size, overlap)
IMFs = emd(signal);
HHT = zeros(length(IMFs(:,1)), length(IMFs(1,:)));
for i = 1:size(IMFs, 1)
HHT(i,:) = hilbert(IMFs(i,:));
end
img = abs(HHT);
img = mat2gray(img);
end
function img = cwt(signal, window_size, overlap)
scales = 1:128;
CWT = cwt(signal, scales, 'amor');
img = abs(CWT);
img = mat2gray(img);
end
function img = rwt(signal, window_size, overlap)
[~, RWT] = modwtn(signal, 'db4', 'type', 'real');
img = abs(RWT);
img = mat2gray(img);
end
function img = synchrosqueezing(signal, window_size, overlap)
FSST = fsst(signal);
img = abs(FSST);
img = mat2gray(img);
end
function img = wsst(signal, window_size, overlap)
WSST = wsst(signal);
img = abs(WSST);
img = mat2gray(img);
end
function img = wsost(signal, window_size, overlap)
WSOST = wsost(signal);
img = abs(WSOST);
img = mat2gray(img);
end
function img = vsost(signal, window_size, overlap)
VSOST = vsost(signal);
img = abs(VSOST);
img = mat2gray(img);
end
function img = msst(signal, window_size, overlap)
MSST = msst(signal);
img = abs(MSST);
img = mat2gray(img);
end
function img = wmsst(signal, window_size, overlap)
WMSST = wmsst(signal);
img = abs(WMSST);
img = mat2gray(img);
end
function img = lmsst(signal, window_size, overlap)
LMSST = lmsst(signal);
img = abs(LMSST);
img = mat2gray(img);
end
function img = trmsst(signal, window_size, overlap)
TRMSST = trmsst(signal);
img = abs(TRMSST);
img = mat2gray(img);
end
function img = sext(signal, window_size, overlap)
SEXT = sext(signal);
img = abs(SEXT);
img = mat2gray(img);
end
function img = wsext(signal, window_size, overlap)
WSEXT = wsext(signal);
img = abs(WSEXT);
img = mat2gray(img);
end
function img = tet(signal, window_size, overlap)
TET = tet(signal);
img = abs(TET);
img = mat2gray(img);
end
function img = so_tet(signal, window_size, overlap)
SO_TET = so_tet(signal);
img = abs(SO_TET);
img = mat2gray(img);
end
function img = gASF(signal, window_size, overlap)
GASF = gramian_angular_field(signal, 'sum');
img = mat2gray(GASF);
end
function img = gADF(signal, window_size, overlap)
GADF = gramian_angular_field(signal, 'difference');
img = mat2gray(GADF);
end
function img = rp(signal, window_size, overlap)
RP = recurrence_plot(signal);
img = mat2gray(RP);
end
function img = rpm(signal, window_size, overlap)
RPM = relative_position_matrix(signal);
img = mat2gray(RPM);
end
function img = mdf(signal, window_size, overlap)
MDF = motif_difference_field(signal);
img = mat2gray(MDF);
end
function GAF = gramian_angular_field(signal, type)
N = length(signal);
angle_mat = acos(zscore(signal)' * zscore(signal) / sqrt(N-1));
GAF = cos(angle_mat);
if strcmp(type, 'difference')
GAF = GAF .* (-1);
end
end
function RP = recurrence_plot(signal)
threshold = std(signal) * 0.1; % Threshold for recurrence
RP = pdist2(signal(:), signal(:)) <= threshold;
end
function RPM = relative_position_matrix(signal)
N = length(signal);
RPM = zeros(N);
for i = 1:N
for j = 1:N
RPM(i,j) = sign(signal(j) - signal(i));
end
end
end
function MDF = motif_difference_field(signal)
N = length(signal);
MDF = zeros(N);
for i = 1:N
for j = 1:N
MDF(i,j) = abs(signal(j) - signal(i));
end
end
end
使用说明
-
配置路径:
- 将
data_folder
设置为存放一维数据文件的目录路径。 - 将
output_folder
设置为保存生成图像的目标目录路径。
- 将
-
运行脚本:
- 在 MATLAB 命令窗口中运行
generate_images.m
。 - 脚本会自动读取
data_folder
中的所有.mat
文件,对每个文件中的信号应用指定的变换方法,并将生成的图像保存到output_folder
中。
- 在 MATLAB 命令窗口中运行
-
注意事项:
- 确保所有必要的工具箱已安装,特别是 Signal Processing Toolbox 和 Wavelet Toolbox。
- 根据需要调整参数,如
window_size
和overlap
。
示例
假设你的数据文件夹结构如下:
data/
├── sample1.mat
├── sample2.mat
└── ...
并且每个 .mat
文件中都有一个名为 signal
的变量。运行 generate_images.m
后,output_folder
将包含以下文件:
output/
├── sample1_mel_spectrogram_1.png
├── sample1_stft_1.png
├── sample1_s_transform_1.png
...
├── sample2_mel_spectrogram_2.png
├── sample2_stft_2.png
├── sample2_s_transform_2.png
...
总结
通过上述 MATLAB 脚本,你可以轻松地将一维数据转换为多种类型的二维图像,并使用这些图像进行深度学习任务。