多传感器时频信号处理:多通道非平稳数据的分析工具(Matlab代码实现)

简介: 多传感器时频信号处理:多通道非平稳数据的分析工具(Matlab代码实现)

💥1 概述

本文可塑造性强。 本文介绍了高分辨率多传感器时频分布(MTFD)及其在多通道非平稳信号分析中的应用。该方法结合了高分辨率时频分析和阵列信号处理方法。MTFD的性能通过多种应用进行了演示,包括基于到达方向(DOA)估计的源定位和非平稳源的自动组分分离(ACS),重点是盲源分离。MTFD方法通过脑电图信号的两个应用进一步说明。一种专门使用 ACS 和 DOA 估计方法进行伪影去除和源定位。另一种使用MTFD进行跨渠道因果关系分析。本文可以换上自己的数据,并将这些方法实现。


📚2 运行结果

部分代码:

clear; close all; clc;
addpath(genpath('Supporting functions'));
%% Main
%% Extracting SNR information from Data Folders
S = dir('../data/DOA Data');
SNR_N = sum([S(~ismember({S.name},{'.','..'})).isdir]);
SNR_i = zeros(1,SNR_N);
for i = 1:SNR_N
    [~, r1] = strtok(S(7+i).name);
    [s1, rrr] = strtok(r1);
    SNR_i(1,i) = str2double(s1);
end
SNR_i = sort(SNR_i);
%% MUSIC and TF-MUSIC Spectrum
SNR_N = 2;
figure('Color',[1 1 1],'Position',[100, 70, 900 500]);
ha = tight_subplot(SNR_N/2,2,[0.05 0.01],[0.12 0.12],[0.08 0.08]);
for i = 1:SNR_N
    Path = ['../data/DOA Data/SNR ' num2str(SNR_i(i)), ' dB'];
    load([Path '/Averaged_Spectrum']);
    axes(ha(i));
    plot(theta, P_tf_music_avg,'-b','linewidth',2); hold on;
    plot(theta, P_music_avg,'-.r','linewidth',2); hold on;
    plot(repmat(ra(1),10),linspace(0,1.2,10),'k--','linewidth',2); hold on
    plot(repmat(ra(2),10),linspace(0,1.2,10),'k--','linewidth',2); grid on
    axis([0 39.9 0 1.2])
    if(mod(i,2) && i < SNR_N-1)
        set(gca,'XTickLabel','','fontweight','bold','fontsize',13);
        ylabel('P_M_U_S_I_C (\theta)','Fontsize',16);
        title(['SNR = ' num2str(SNR_i(i)), ' dB'],'fontsize',20);
    elseif i == SNR_N-1
        set(gca,'fontweight','bold','fontsize',13);
        ylabel('P_M_U_S_I_C (\theta)','Fontsize',16);
        xlabel('\theta (deg)','Fontsize',16);
        title(['SNR = ' num2str(SNR_i(i)), ' dB'],'fontsize',20);
    elseif i == SNR_N
        set(gca,'YTickLabel','','fontweight','bold','fontsize',13);
        xlabel('\theta (deg)','Fontsize',16);
        title(['SNR = ' num2str(SNR_i(i)), ' dB'],'fontsize',20);
        legend('TF-MUSIC Averaged Spectrum','MUSIC Averaged Spectrum','True Angles','Location','Southwest')
    else
        set(gca,'XTickLabel','','YTickLabel','','fontweight','bold');
        title(['SNR = ' num2str(SNR_i(i)), ' dB'],'fontsize',20);
    end
end
set(gcf,'Units','inches'); screenposition = get(gcf,'Position');
set(gcf,'PaperPosition',[0 0 screenposition(3:4)],'PaperSize',screenposition(3:4));
%% DOA NMSE
SNR_N = sum([S(~ismember({S.name},{'.','..'})).isdir]);
Path = ['../data/DOA Data/SNR ' num2str(SNR_i(i)), ' dB'];
load([Path '/DOA'],'ra');
nmse_music     = zeros(length(ra), SNR_N);
nmse_tf_music  = zeros(length(ra), SNR_N);
nmse_esprit    = zeros(length(ra), SNR_N);
nmse_tf_esprit = zeros(length(ra), SNR_N);
music_rate    = zeros(length(ra), SNR_N);
tf_music_rate = zeros(length(ra), SNR_N);
for i = 1:SNR_N
    Path = ['../data/DOA Data/SNR ' num2str(SNR_i(i)), ' dB'];
    load([Path '/DOA']);
    for j = 1:length(ra)
        temp1 = DOA_music(:,j); temp2 = DOA_tf_music(:,j);
        music_rate(j,i)    = sum(temp1~=0)/length(temp1);
        tf_music_rate(j,i) = sum(temp2~=0)/length(temp2);
        temp1 = temp1(temp1~=0); temp2 = temp2(temp2~=0);
        nmse_music(j,i)     = (mean(((temp1 - ra(j))/ra(j)).^2));
        nmse_tf_music(j,i)  = (mean(((temp2 - ra(j))/ra(j)).^2));
        nmse_esprit(j,i)    = (mean(((DOA_esprit(:,j) - ra(j))/ra(j)).^2));
        nmse_tf_esprit(j,i) = (mean(((DOA_tf_esprit(:,j) - ra(j))/ra(j)).^2));
    end
end
fprintf(2,'Mean Probability of Detection (Pd)\n');
fprintf('MUSIC     : %0.3f\n',mean(mean(music_rate)));
fprintf('TF_MUSIC  : %0.3f\n',mean(mean(tf_music_rate)))
fprintf('ESPRIT    : %0.1f\n',1)
fprintf('TF_ESPRIT : %0.1f\n',1)
figure('Color',[1 1 1],'Position',[100, 10, 650, 550]);
ha = tight_subplot(1,1,[0.01 0.01],[0.12 0.1],[0.12 0.12]);
axes(ha(1));
plot(SNR_i,10*log10(mean(nmse_tf_music)),'-b','linewidth',2);  hold on;
plot(SNR_i,10*log10(mean(nmse_music)),'--b','linewidth',2);    hold on;
plot(SNR_i,10*log10(mean(nmse_tf_esprit)),'-.r','linewidth',2); hold on;
plot(SNR_i,10*log10(mean(nmse_esprit)),':r','linewidth',2);   grid on;
xlim([SNR_i(1) SNR_i(end)]);
legend('TF-MUSIC','MUSIC','TF-ESPRIT','ESPRIT','Location','Southwest');
set(gca,'fontweight','bold','fontsize',14);
title('DOA Normalized Mean Square Error','fontsize',18);
xlabel('SNR (dB)'); ylabel('NMSE (dB)');
set(gcf,'Units','inches'); screenposition = get(gcf,'Position');
set(gcf,'PaperPosition',[0 0 screenposition(3:4)],'PaperSize',screenposition(3:4));
%% DOA PDFs
SNR_N = 2;
bins_N = 100;
for i = 1:SNR_N
    aa= figure('Color',[1 1 1],'Position',[100, 0, 650, 700]);
    ha = tight_subplot(2,1,[0.01 0.01],[0.1 0.1],[0.05 0.05]);
    Path = ['../data/DOA Data/SNR ' num2str(SNR_i(i)), ' dB'];
    load([Path '/DOA']);
    axes(ha(1)); temp = DOA_music; temp = temp(temp~=0);
    histogram(temp, bins_N,'Normalization','probability','facecolor',[1 0.84 0],'linewidth',1.2); hold on;
    temp = DOA_tf_music; temp = temp(temp~=0);
    histogram(temp, bins_N,'Normalization','probability',...
        'facecolor',[1 0 0],'linewidth',1.2); xlim([0 40]);
    temp1 = DOA_music(:,1); temp1 = temp1(temp1~=0); u1 = mean(temp1); s = std(temp1);
    tag11 = ['\mu_1 = ', num2str(round(u1,1)), ', \sigma_1 = ', num2str(round(s,1))];
    temp1 = DOA_music(:,2); temp1 = temp1(temp1~=0); u1 = mean(temp1); s = std(temp1);
    tag12 = ['\mu_2 = ', num2str(round(u1,1)), ', \sigma_2 = ', num2str(round(s,1))];
    tag1 = ['         MUSIC' char(10) tag11 char(10) tag12];
    temp1 = DOA_tf_music(:,1); temp1 = temp1(temp1~=0); u1 = mean(temp1); s = std(temp1);
    tag11 = ['\mu_1 = ', num2str(round(u1,1)), ', \sigma_1 = ', num2str(round(s,1))];
    temp1 = DOA_tf_music(:,2); temp1 = temp1(temp1~=0); u1 = mean(temp1); s = std(temp1);
    tag12 = ['\mu_2 = ', num2str(round(u1,1)), ', \sigma_2 = ', num2str(round(s,1))];
    tag2 = ['       TF-MUSIC' char(10) tag11 char(10) tag12];
    legend(tag1, tag2,'Location','Northwest'); grid on;
    set(gca,'XTickLabel','','YTickLabel','','fontweight','bold','fontsize',13);
    title(['SNR = ' num2str(SNR_i(i)), ' dB'],'fontsize',20);
    axes(ha(2));
    histogram(DOA_esprit, bins_N,'Normalization','probability',...
        'facecolor',[0 0.5 0],'linewidth',1.2); hold on;
    histogram(DOA_tf_esprit, bins_N,'Normalization','probability',...
        'facecolor',[0 0.45 0.74],'linewidth',1.2); xlim([0 40]);
    temp1 = DOA_esprit(:,1); u1 = mean(temp1); s = std(temp1);
    tag11 = ['\mu_1 = ', num2str(round(u1,1)), ', \sigma_1 = ', num2str(round(s,1))];
    temp1 = DOA_esprit(:,2); u1 = mean(temp1); s = std(temp1);
    tag12 = ['\mu_2 = ', num2str(round(u1,1)), ', \sigma_2 = ', num2str(round(s,1))];
    tag1 = ['         ESPRIT' char(10) tag11 char(10) tag12];
    temp1 = DOA_tf_esprit(:,1); u1 = mean(temp1); s = std(temp1);
    tag11 = ['\mu_1 = ', num2str(round(u1,1)), ', \sigma_1 = ', num2str(round(s,1))];
    temp1 = DOA_tf_esprit(:,2); u1 = mean(temp1); s = std(temp1);
    tag12 = ['\mu_2 = ', num2str(round(u1,1)), ', \sigma_2 = ', num2str(round(s,1))];
    tag2 = ['       TF-ESPRIT' char(10) tag11 char(10) tag12];
    legend(tag1, tag2,'Location','Northwest'); grid on;
    set(gca,'YTickLabel','','fontweight','bold','fontsize',13);
    xlabel('\theta (deg)');
    set(gcf,'Units','inches'); screenposition = get(gcf,'Position');
    set(gcf,'PaperPosition',[0 0 screenposition(3:4)],'PaperSize',screenposition(3:4));
end

🌈3 Matlab代码实现

🎉4 参考文献

部分理论来源于网络,如有侵权请联系删除。


[1] B. Boashash, A. Aissa-El-Bey, M. F. Al-Sa'd, Multisensor Time-Frequency Signal Processing:

   A tutorial review with illustrations in selected application areas, Digital Signal Processing, In Press.

[2] B. Boashash, A. Aissa-El-Bey, M. F. Al-Sa'd, Multisensor time-frequency signal processing software Matlab package: An analysis tool for multichannel non-stationary data , SoftwareX, In Press.

相关文章
|
11天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
|
17天前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
112 0
|
13天前
|
传感器 算法 数据挖掘
基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合
基于协方差交叉(CI)的多传感器融合算法,通过MATLAB仿真对比单传感器、SCC与CI融合在位置/速度估计误差(RMSE)及等概率椭圆上的性能。采用MATLAB2022A实现,结果表明CI融合在未知相关性下仍具鲁棒性,有效降低估计误差。
124 15
|
17天前
|
传感器 机器学习/深度学习 算法
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
|
25天前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
|
1月前
|
传感器 算法 机器人
【IMU数据与GPS融合的预积分方法】基于流形的IMU预积分,用于高效的视觉惯性最大后验估计、SE3姿势区分为IMU(Matlab代码实现)
【IMU数据与GPS融合的预积分方法】基于流形的IMU预积分,用于高效的视觉惯性最大后验估计、SE3姿势区分为IMU(Matlab代码实现)
|
17天前
|
传感器 数据采集 存储
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
|
17天前
|
传感器 算法 定位技术
【GPS+INS在MAV导航上融合】基于间接卡尔曼滤波的IMU与GPS融合MATLAB仿真(IMU与GPS数据由仿真生成)
【GPS+INS在MAV导航上融合】基于间接卡尔曼滤波的IMU与GPS融合MATLAB仿真(IMU与GPS数据由仿真生成)
|
17天前
|
机器学习/深度学习 安全 Serverless
【创新未发表】【故障诊断】基于连续小波变换-CNN, ResNet, CNN-SVM, CNN-BiGRU, CNN-LSTM的故障诊断研究【凯斯西储大学数据】(Matlab代码实现)
【创新未发表】【故障诊断】基于连续小波变换-CNN, ResNet, CNN-SVM, CNN-BiGRU, CNN-LSTM的故障诊断研究【凯斯西储大学数据】(Matlab代码实现)

热门文章

最新文章