你可以给个matlab代码演示吗
时间: 2024-03-10 09:47:44 浏览: 67
当然可以,以下是使用1D-CNN分类离散信号的MATLAB代码示例:
首先,我们需要准备训练数据和测试数据。这里我们使用MATLAB内置的信号生成函数来生成两类不同的离散信号,分别是正弦信号和方波信号。代码如下:
```matlab
% 生成正弦信号
fs = 1000; % 采样频率
t = 0:1/fs:1-1/fs; % 时间序列
x1 = sin(2*pi*50*t) + randn(size(t)); % 正弦信号加上噪声
% 生成方波信号
x2 = square(2*pi*50*t);
% 绘制信号波形图
figure;
subplot(2,1,1);
plot(t, x1);
xlabel('Time (s)');
ylabel('Amplitude');
title('Sinusoidal Signal');
subplot(2,1,2);
plot(t, x2);
xlabel('Time (s)');
ylabel('Amplitude');
title('Square Signal');
```
接下来,我们将生成的信号划分为训练集和测试集,代码如下:
```matlab
% 将信号划分为训练集和测试集
trainRatio = 0.8; % 训练集比例
idx = randperm(length(t)); % 随机打乱信号序列
trainIdx = idx(1:round(length(t)*trainRatio)); % 训练集索引
testIdx = idx(round(length(t)*trainRatio)+1:end); % 测试集索引
% 构造训练数据和测试数据
XTrain = cat(3, x1(trainIdx)', x2(trainIdx)'); % 训练数据
YTrain = categorical([ones(1,length(trainIdx)), 2*ones(1,length(trainIdx))]); % 训练数据标签
XTest = cat(3, x1(testIdx)', x2(testIdx)'); % 测试数据
YTest = categorical([ones(1,length(testIdx)), 2*ones(1,length(testIdx))]); % 测试数据标签
```
然后,我们可以定义1D-CNN模型并进行训练,代码如下:
```matlab
% 定义1D-CNN模型
numClasses = 2; % 类别数
inputSize = [1 length(t)*trainRatio 2]; % 输入大小
filterSize = 50; % 卷积核大小
numFilters = 10; % 卷积核个数
poolSize = 20; % 池化大小
numHiddenUnits = 100; % 隐藏层神经元个数
layers = [
sequenceInputLayer(inputSize)
convolution1dLayer(filterSize, numFilters,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling1dLayer(poolSize,'Stride',poolSize)
convolution1dLayer(filterSize, numFilters,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling1dLayer(poolSize,'Stride',poolSize)
lstmLayer(numHiddenUnits,'OutputMode','last')
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
% 定义训练选项
options = trainingOptions('adam', ...
'MaxEpochs',30, ...
'MiniBatchSize',50, ...
'InitialLearnRate',1e-3, ...
'Shuffle','every-epoch', ...
'Verbose',false, ...
'Plots','training-progress');
% 训练模型
net = trainNetwork(XTrain,YTrain,layers,options);
```
最后,我们可以使用训练好的模型对测试数据进行分类,并计算分类准确率,代码如下:
```matlab
% 对测试数据进行分类
YPred = classify(net,XTest);
% 计算分类准确率
accuracy = sum(YPred == YTest)/numel(YTest);
fprintf('Test Accuracy: %0.2f%%\n',accuracy*100);
```
运行以上代码,就可以使用1D-CNN对离散信号进行分类了。当然,这只是一个简单的示例,实际应用中需要根据具体情况进行调整和优化。
阅读全文