目的
利用简单的CNN网络实现对不同波形的识别,利用MATLAB生成带有高斯白噪声的正弦波,余弦波,以及三角波。MATLAB代码如下:
clc
clear
% 设置参数
num_datasets = 1000; % 总共生成的测试集数量
num_points = 100; % 每个测试集的数据点数
fs = 1000; % 采样频率,单位Hz
t = (0:num_points-1) / fs; % 时间向量
% 信号频率
f_sin = 10; % 正弦信号频率 10 Hz
f_cos = 10; % 余弦信号频率 10 Hz
f_tri = 10; % 三角波信号频率 10 Hz
% 信号幅值
amplitude = 10; % 信号幅值
% 生成测试集
datasets = cell(num_datasets, 3); % 创建一个元胞数组来存储数据
for i = 1:num_datasets
% 正弦信号
sin_wave = amplitude * sin(2 * pi * f_sin * t); % 信号幅值调整为60,频率为10Hz
% 计算正弦信号的功率
signal_power_sin = rms(sin_wave)^2;
% 随机选择一个SNR,SNR范围是10到15之间
SNR_sin = rand() * 5+10; % SNR范围是10到15之间
% 根据目标SNR计算噪声标准差
noise_std_sin = signal_power_sin / (10^(SNR_sin / 10));
noisy_sin = sin_wave + noise_std_sin * randn(size(t)); % 添加噪声
% 余弦信号
cos_wave = amplitude * cos(2 * pi * f_cos * t); % 信号幅值调整为60,频率为10Hz
% 计算余弦信号的功率
signal_power_cos = rms(cos_wave)^2;
% 随机选择一个SNR,SNR范围是15到20之间
SNR_cos = rand() * 5+10; % SNR范围是10到15之间
% 根据目标SNR计算噪声标准差
noise_std_cos = signal_power_cos / (10^(SNR_cos / 10));
noisy_cos = cos_wave + noise_std_cos * randn(size(t)); % 添加噪声
% 三角波信号
tri_wave = amplitude * sawtooth(2 * pi * f_tri * t, 0.5); % 信号幅值调整为60,频率为10Hz
% 计算三角波信号的功率
signal_power_tri = rms(tri_wave)^2;
% 随机选择一个SNR,SNR范围是10到15之间
SNR_tri = rand() * 5+10; % SNR范围是10到15之间
% 根据目标SNR计算噪声标准差
noise_std_tri = signal_power_tri / (10^(SNR_tri / 10));
noisy_tri = tri_wave + noise_std_tri * randn(size(t)); % 添加噪声
% 将每个数据集存储到元胞数组中
datasets{i, 1} = noisy_sin; % 存储正弦信号
datasets{i, 2} = noisy_cos; % 存储余弦信号
datasets{i, 3} = noisy_tri; % 存储三角波信号
end
% 可以查看某一组数据的内容
figure;
subplot(3,1,1);
plot(t, datasets{1,1});
title('Noisy Sine Wave');
subplot(3,1,2);
plot(t, datasets{1,2});
title('Noisy Cosine Wave');
subplot(3,1,3);
plot(t, datasets{1,3});
title('Noisy Triangle Wave');
代码说明:
(1)一维数据点数为100,余弦,正弦以及三角信号的样本数量个1000个,总共有3000个训练样本。
(2)所加入的噪声信噪比在10~15db之间。噪声随机。
效果展示:
将产生的数据存入txt中。
% Save datasets to txt files
% 打开一个txt文件用于写入
fileID_x = fopen('feature_point.txt', 'w'); % 'w'表示写入模式
fileID_y = fopen('exportation.txt', 'w'); % 'w'表示写入模式
% 检查文件是否成功打开
if fileID_x == -1
error('文件打开失败');
end
% 将 datasets 中的内容逐行写入文件
for i = 1:size(datasets, 1) % 遍历每一行
for j = 1:size(datasets, 2) % 遍历每一列
% 检查该单元是否为数值
if isnumeric(datasets{i, j})
% 如果是数值类型,使用'%g'格式
fprintf(fileID_x, '%g ', datasets{i, j});
else
% 否则,假设是字符串,使用'%s'格式
fprintf(fileID_x, '%s ', datasets{i, j});
end
output = j-1;
fprintf(fileID_y, '%g ', output);
fprintf(fileID_x, '\n');
fprintf(fileID_y, '\n');
end
% 写入换行符
end
% 关闭文件
fclose(fileID_x);
fclose(fileID_y);
代码说明:
(1) 样本存在一个txt中,标签存在另一个txt中,并且样本与标签一一对应。
(2)数据存储格式为每个样本数据以空格隔开,样本与样本之间用换行隔开,标签存储类似。