Jacobi并行拆解【补充】
作者:桂。
时间:2018-04-24 22:04:52
链接:http://www.cnblogs.com/xingshansi/p/8934373.html
前言
本文为Jacobi并行拆解一文的补充,给出另一种矩阵运算的思路。
一、算法流程
对于复数相关矩阵R,通过矩阵变换,在维度不变的情况下,转化为实数矩阵:

对于MUSIC算法,该思路可以降低Jacobi运算复杂度。额外的操作仅仅是少量的乘法操作,即耗费少量硬件资源换取更快速的处理时间。
直接复数转实数,需要将nxn的矩阵扩展为2n x 2n的矩阵,而直接转化的相关矩阵仍然为 n x n,降低了Jacobi的复杂度。
容易证明U*Un为新的特征向量,而U可与导向矢量a提前乘法处理,存储到Ram里。
这里可以看出:(R + J*conj(R)*J)/2等价于中心对称线阵的前、后项空间平滑算法,而斜Hermitian矩阵的特征向量与转化的特征向量等价,因此可以得出特性:对于具备中心对称特性的线阵,复数->实数,既可以降低Jacobi复杂度,又具备了解相干信号的能力。
二、仿真验证
未做实数化处理,code:
clc;clear all;close all
%Ref:Narrowband direction of arrival estimation for antenna arrays
doas=[-30 -5 40]*pi/180; %DOA's of signals in rad.
P=[1 1 1]; %Power of incoming signals
N=10; %Number of array elements
K=1024; %Number of data snapshots
d=0.5; %Distance between elements in wavelengths
noise_var=1; %Variance of noise
r=length(doas); %Total number of signals
% Steering vector matrix. Columns will contain the steering vectors
% of the r signals
A=exp(-i*2*pi*d*(0:N-1)'*sin([doas(:).']));
% Signal and noise generation
sig=round(rand(r,K))*2-1; % Generate random BPSK symbols for each of the
% r signals
noise=sqrt(noise_var/2)*(randn(N,K)+i*randn(N,K)); %Uncorrelated noise
X=A*diag(sqrt(P))*sig+noise; %Generate data matrix
R=X*X'/K; %Spatial covariance matrix
[Q ,D]= svd(R); %Compute eigendecomposition of covariance matrix
[D,I]=sort(diag(D),1,'descend'); %Find r largest eigenvalues
Q=Q(:,I);%Sort?the?eigenvectors?to?put?signal?eigenvectors?first
Qs=Q (:,1:r); %Get the signal eigenvectors
Qn=Q(:,r+1:N); %Get the noise eigenvectors
% MUSIC algorithm
%?Define?angles?at?which?MUSIC???spectrum????will?be?computed
angles=(-90:0.1:90);
%Compute steering vectors corresponding values in angles
a1=exp(-i*2*pi*d*(0:N-1)'*sin([angles(:).']*pi/180));
for k=1:length(angles)%Compute?MUSIC???spectrum??
music_spectrum(k)= 1/(a1(:,k)'*Qn*Qn'*a1(:,k));
end
figure(1)
plot(angles,abs(music_spectrum))
title('MUSIC Spectrum')
xlabel('Angle in degrees')

实数化处理,code:
clc;clear all;close all
%Ref:Narrowband direction of arrival estimation for antenna arrays
doas=[-30 -5 40]*pi/180; %DOA's of signals in rad.
P=[1 1 1]; %Power of incoming signals
N=10; %Number of array elements
K=1024; %Number of data snapshots
d=0.5; %Distance between elements in wavelengths
noise_var=1; %Variance of noise
r=length(doas); %Total number of signals
% Steering vector matrix. Columns will contain the steering vectors
% of the r signals
A=exp(-i*2*pi*d*(0:N-1)'*sin([doas(:).']));
% Signal and noise generation
sig=round(rand(r,K))*2-1; % Generate random BPSK symbols for each of the
% r signals
noise=sqrt(noise_var/2)*(randn(N,K)+i*randn(N,K)); %Uncorrelated noise
X=A*diag(sqrt(P))*sig+noise; %Generate data matrix
R=X*X'/K; %Spatial covariance matrix
%% Reconstruct
%实数
n = size(R);
I = eye(n/2);
J = fliplr(eye(n));
U = 1/sqrt(2)*[I fliplr(I);1j*fliplr(I) -1j*I];
R = 0.5*U*(R+J*conj(R)*J)*U';
% Reconstruct_end
[Q ,D]= svd(R); %Compute eigendecomposition of covariance matrix
[D,I]=sort(diag(D),1,'descend'); %Find r largest eigenvalues
Q=Q(:,I);%Sort?the?eigenvectors?to?put?signal?eigenvectors?first
Qs=Q (:,1:r); %Get the signal eigenvectors
Qn=Q(:,r+1:N); %Get the noise eigenvectors
% MUSIC algorithm
%?Define?angles?at?which?MUSIC???spectrum????will?be?computed
angles=(-90:0.1:90);
%Compute steering vectors corresponding values in angles
a1=exp(-i*2*pi*d*(0:N-1)'*sin([angles(:).']*pi/180));
for k=1:length(angles)%Compute?MUSIC???spectrum??
music_spectrum(k)= 1/(a1(:,k)'*U'*Qn*Qn'*U*a1(:,k));
end
figure(1)
plot(angles,abs(music_spectrum))
title('MUSIC Spectrum')
xlabel('Angle in degrees')

Jacobi并行拆解【补充】的更多相关文章
- Jacobi并行拆解
作者:桂. 时间:2018-04-23 21:12:02 链接:http://www.cnblogs.com/xingshansi/p/8921815.html 前言 本文主要是复数矩阵分解的拆解思 ...
- 进程队列补充、socket实现服务器并发、线程完结
目录 1.队列补充 2.关于python并发与并行的补充 3.TCP服务端实现并发 4.GIL全局解释器锁 什么是保证线程安全呢? GIL与Lock 5.验证多线程的作用 对结论的验证: 6.死锁现象 ...
- 深入理解Java虚拟机之JVM垃圾回收随笔
1.对象已经死亡? 1.1引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用 的.但是它很难解决 ...
- 《OpenCL异构并行编程实战》补充笔记散点,第一至四章
▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...
- Python基础补充(二) 多核CPU上python多线程并行的一个假象【转】
在python上开启多个线程,由于GIL的存在,每个单独线程都会在竞争到GIL后才运行,这样就干预OS内部的进程(线程)调度,结果在多核CPU上: python的多线程实际是串行执行的,并不会同一时间 ...
- 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章
▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...
- OpenMP 《并行程序设计导论》的补充代码
▶ 使用 OpenMP 和队列数据结构,在各线程之间传递信息 ● 代码,使用 critical 子句和 atomic 指令来进行读写保护 // queue.h #ifndef _QUEUE_H_ #d ...
- Pthreads 《并行程序设计导论》的补充代码
▶ 关于单链表的访问,插入结点和删除结点操作,并且将其推广到多线程中去. ● 代码,通用的随机数生成 // my_rand.h #ifndef _MY_RAND_H_ #define _MY_RAND ...
- .Net并行编程(一)-TPL之数据并行
前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...
随机推荐
- Android基础新手教程——1.10 反编译APK获代替码&资源
Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...
- Maven项目继承与聚合
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628534.html 一:继承 在Java编程中,如果多个类都使用到了相同的内容.方法时,我们可以用继承的方 ...
- cgroup 分析之CPU和内存部分
https://ggaaooppeenngg.github.io/zh-CN/2017/05/07/cgroups-%E5%88%86%E6%9E%90%E4%B9%8B%E5%86%85%E5%AD ...
- logstash写日志elaticsearch不响应
在大量的解析日志并写入elasticsearch,在后端节点数据数量及磁盘性能等影响下,es不响应 问题描述: [--12T17::,][WARN ][logstash.outputs.elastic ...
- 基于kettle8的web端调度监控平台
发布时间:2018-11-16 技术:spring+springmvc +beetlsql+quartz+kettle8 概述 Kettle调度监控平台(以下简称KS)是一个自主开发的java ...
- PHP-SESSION深入理解
1.浏览器窗口与SESSION间的关系 记得去年的时候网上抢手机(你懂的), 特意开两个窗口, 哪个进度快用哪个.如此到输入验证码的时候老是出错, 结果----没抢到~ 后来写了个程序, 如下: &l ...
- (原)torch7中指定可见的GPU
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7418694.html 参考网址: https://gitter.im/torch/torch7/arc ...
- webservice(草稿)
1. 概述 WebService是一种跨编程语言和跨操作系统平台的远程调用技术. Webservice是被定义用来使不同应用之间通过网络传输数据的一种标准,此标准和具体的语言无关,至于哪种语言提供接 ...
- HDUOJ-----Climbing Worm
Climbing Worm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Quartz中时间表达式的设置-----corn表达式 (转)
Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y( ...