基于小波分析的瞬态信号检测器用roc曲线对其检测性能进行评价

1.我已经完成将一瞬态信号进行3层离散小波分解,得到其各层小波分解细节信号,并可以观察出成功检测,但是现在我需要通过绘制roc曲线来对其检测性能进行评估,那如何绘制他的roc曲线?

2.我的想法是以不同的信噪比组合,每种信噪比组合进行仿真检测运行1000次,检测结果包括相应信噪比下的检测概率和虚警概率,门限按照虚警概率小于%1设定,然后绘制出roc曲线,但是我不会,或者有其他绘制roc曲线的方法吗?

3.我的程序代码

[/code

clear all; close all; clc;    

%% 瞬态信号建模

fs = 1000;                % 采样频率1000Hz

ts = 1 / fs;              % 采样时间间隔1ms

t = 0 : ts : 1;      % 采样时间。每隔1ms采一次,采样1s

L = length(t);                 % 信号长度1000

f0 = 10  ;                %信号频率10Hz

s = sin(2 * pi * f0 * t); % 原始正弦信号

sigma=0.1;

n=normrnd(0,sigma,1,L);  %生成0均值,标准差为0.1的高斯白噪声

s =s+n;                   % 添加噪声

t1=0.4;

t2=0.8;                   %瞬态信号位置

x1=zeros(size(t));        %生成一个与t同大小的0矩阵  

x1(t1*fs)=1;               

x1(t2*fs)=2;              %瞬态信号幅值  

s=s+x1;                 %添加瞬态信号 

figure(1); 

plot(t,s)

xlabel('时间/s');ylabel('幅值'); 

title('含噪的瞬态信号');       %时域波形

 

%% 连续小波变换(CWT)

figure(2)

cw1 = cwt(s,1:32,'sym2','plot'); % 对信号做连续小波变换,并作出系数图像

title('连续小波变换系数图');

 

%% 离散小波变换(DWT)

[d,a]=wavedec(s,3,'db4');           %对原始信号进行3层离散小波分解

a3=wrcoef('a',d,a,'db4',3);        %重构1-3层近似信号

a2=wrcoef('a',d,a,'db4',2);         

a1=wrcoef('a',d,a,'db4',1);         

d3=wrcoef('d',d,a,'db4',3);         %重构1-3层吗细节信号

d2=wrcoef('d',d,a,'db4',2);         

d1=wrcoef('d',d,a,'db4',1);         

 

figure(3); 

subplot(411);plot(s);ylabel('原始信号s'); %画出各层小波近似信号

title('小波分解各层近似信号示意图');

subplot(412);plot(a3);ylabel('近似信号a3');

subplot(413);plot(a2);ylabel('近似信号a2');

subplot(414);plot(a1);ylabel('近似信号a1');

xlabel('时间/s'); 

 

figure(4)

subplot(411);plot(s);ylabel('原始信号s');  %画出各层小波细节信号

title('小波分解各层细节信号示意图');

subplot(412);plot(d3);ylabel('细节信号d3');

subplot(413);plot(d2);ylabel('细节信号d2');

subplot(414);plot(d1);ylabel('细节信号d1');

xlabel('时间/s'); 

 

%% 性能检测

sigPower = sum(abs(s).^2)/length(s);            %求出信号功率

noisePower=sum(abs(n).^2)/length(n);       %求出噪声功率

SNR_10=10*log10(sigPower/noisePower);            %由信噪比定义求出信噪比,单位为db

T=sigma*(2*log10(L))^0.5                   %确定阈值]

问题位置:%%性能检测

小波这块不太懂,不过绘制ROC曲线还是有所了解,ROC曲线绘制的是真正例率和假正例率的曲线,也就是说需要知道样本的类别数(正类数和反类数),还需要知道模型的预测值,根据模型的预测值、阈值及样本的类别求出真正例率和假正例率,然后绘制它们的曲线。

现在,真正例率和假正例率可以求出来吗?

 

这是我得到的检测图

gmap = imresize(d1,size(n));
smap = imresize(n,0.1);
gmap = imresize(gmap,0.1);

% 二值化ground truth map, 只要两类
thresh_value =graythresh(gmap);
final_gmap = imbinarize(gmap, thresh_value);

% smap归一化到[0,1]
smap = mat2gray(smap);

% 数组
smap_array = smap(:); 
gmap_array = final_gmap(:);

% 总真实为正例数
idex = find(gmap_array == 1);
P_num = length(idex);

% 总真实为负例数
N_num = length(gmap_array) - P_num;

% 从大到小排序,orig_location保存了排序前像素在smap_array的位置
[saliency_values, orig_location] = sort(smap_array, 'descend'); 

% TP(1) = 0; FP(1) = 0; 
% TP(end) = 1; FP(end) = 1;
% 当以salicy_values(i)为阈值时,前面数组saliency_values前面i个都判为正例
for i=1:length(saliency_values)
    
    % 查看前i个被判为正例的像素,真实情况如何。
    TP(i) = 0; % 真正例,真实为正例,预测也为正例;
    FP(i) = 0; % 假正例,真实为负例,预测为正例;
    for m=1:i
        if gmap_array(orig_location(m)) == 1
            TP(i) = TP(i) + 1;
        else
            FP(i) = FP(i) + 1;
        end
    end
    
    FPR(i) = FP(i) / N_num;
    TPR(i) = TP(i) / P_num;
    
end

auc = trapz(FPR,TPR); % 以FPR为x轴,以TPR为y轴,算积分,即为ROC下的面积
figure(5)
plot(FPR, TPR, '.b-');   
title(['AUC:          ', num2str(auc),'     SNR:',num2str(SNR)])

这是我在网上找的程序,我想知道最开头的gamp和smap分别对应我前面小波检测器的两个量。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,欢迎您加入CSDN!

目前问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632