Hey all,
I'm currently trying to implement a program from a published journal.
where y(n) = signal + noise. H is the transpose of the matrix.
AIC is
These are the 4 steps i'm supposed to implement.
As such, this is my code for this.
Code:
clear all;
close all;
% Proposed Scheme A
% AIC & MDL
%Setting up the simulation
N = 100; %Number of samples.
Q = 40; %Number of channels
% Step 1 calculate sampling covariance matrix
t = 0;
for n = 1:N
s = [0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0]'; %signal source. 1 means there is a signal in that channel.
e = randn(1,Q)';
Pnoise = e * sqrt(0.1); %10dB SNR
y = s + Pnoise;
G = y*y';
t = t + G;
end
Y = t/N; %Sampling convariance matrix Y = 1/N sum[y(n)*y(n)']
% Step 2 Perform eigenvalue decomposition
F = eig(Y); %F is the eigenvalue decomposition
c = dsort(F); %to get the diagonal values into (p1>p2>...>pq)
f = 1; %initial counter
p = 0;
z = 0;
%Step 3 use AIC or MDL to estimate number of occupied channels
H = 0;
for h = 2:Q
H = H + 1;
z = z + 1;
f = f * c(h) %Product part of AIC equation
p = p + c(h) %Summation part of AIC equation
AIC(z) = -2*N*log10(f/((1/(Q-H)*p)^(Q-H))) + 2*H*(2*Q - H);
MDL(z) = -N*log10(f/((1/(Q-H)*p)^(Q-H))) + 0.5*H*(2*Q-H)*log10(N);
end
[U,K] = min(AIC);
[u,k] = min(MDL);
% Step 4 choose indexes with largest diagonal elements
x = diag(Y);
X = diag(Y);
for b = K:-1:1 % AIC
[r,R] = max(x);
x(R) = 0;
end
for P = k:-1:1 % MDL
[l,L] = max(X);
x(L) = 0;
end
pdcounter = 0;
pd1counter = 0;
for B = 1:Q
if x(B) == 0 && s(B) == 1
pdcounter = pdcounter + 1;
end
end
for Bb = 1:Q
if X(Bb) == 0 && s(Bb) == 1
pd1counter = pd1counter + 1;
end
end
For those that are running the code, you'll find that both k values are 1, which is wrong obviously wrong. can anyone debug it for me? thanks in advance!