Clear Filters
Clear Filters

three level DFT need help in error

1 view (last 30 days)
common fernando
common fernando on 4 Dec 2020
Edited: KALYAN ACHARJYA on 4 Dec 2020
clear all; close all; clc
fs=200; %sampling freq.
dt =1/fs;
N0=fs/3; %number of samples/cycle
m=3; %no. of cycles
t = linspace(0,200,1+N0*m); %data window
fi=50; %Frequency test
ww=wgn(201,1,-40);
size(transpose(ww))
x= sin(2*pi*fi*t + 0.3);
v = bsxfun( @plus, x , ww );
%v=@(t) (sin(2*pi*fi.*t + 0.3)+ transpose(wgn(1+N0*m,1,-40)));
tmax=1;
n=N0-1:-1:0;
f0=50;
f=50.88;
Hc=2/N0*cos(2*pi*n/N0+pi/N0);
Hs=-2/N0*sin(2*pi*n/N0+pi/N0);
t_est=[];
f_est=[];
j_max=tmax*fs;
for j=1:j_max+1
x=v((j-1:j+N0-2)*dt);
c(j)=x*Hc';
s(j)=x*Hs';
if(j>N0)
Ac(j-N0)=sqrt(sum(c(end-N0+1:end).^2)/N0);
As(j-N0)=sqrt(sum(s(end-N0+1:end).^2)/N0);
cc(j-N0)=c(end-N0+1:end)*Hc';
ss(j-N0)=c(end-N0+1:end)*Hs';
if(j>2*N0)
Acc(j-2*N0)=sqrt(sum(cc(end-N0+1:end).^2)/N0);
Ass(j-2*N0)=sqrt(sum(ss(end-N0+1:end).^2)/N0);
ccc(j-2*N0)=cc(end-N0+1:end)*Hc';
ccs(j-2*N0)=cc(end-N0+1:end)*Hs';
ssc(j-2*N0)=ss(end-N0+1:end)*Hc';
sss(j-2*N0)=ss(end-N0+1:end)*Hs';
ff=f0*N0/pi*atan(tan(pi/N0)*((ccc(j-2*N0).^2+ccs(j-2*N0).^2)./(ssc(j-2*N0).^2+sss(j-2*N0).^2)).^.25);
t_est=[t_est;(j-1)*dt];
f_est=[f_est;ff];
end
end
end
t_est;
f_est
RMSE = sqrt(mean((f_est-fi).^2))
plot(t_est,f_est,'red')
hold on
xlabel('time')
ylabel('frequency')
title('three LDFT white noise')
plot (t,fi)
plot (t,fi)
hold off
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ERROR
Subscript indices must either be real positive integers or logicals.
Error in CODE (line 23)
x=v((j-1:j+N0-2)*dt);
>>

Answers (1)

KALYAN ACHARJYA
KALYAN ACHARJYA on 4 Dec 2020
Edited: KALYAN ACHARJYA on 4 Dec 2020
Please note: MATLAB allows positive array indices only, examples
data(-2); % Invalid
data(0); % Invalid
data(4); % Valid
Whatever you do during array indexing, please make sure that within "()", there should be a positive integer values only such as 1,2,3,….
In the code, as you have shared, in the first iteration of the loop
N0=fs/3; %Which approximately equal to 66.67
For the iteration, once the "j" reach to 67, then "if condition" becomes true, in that case:
for j=1:j_max+1
...
if j>N0
Ac(j-N0)=....
end
end
Here
A(67-N0)
A(67-66.66)
%.. ^= is no a positive integer
Hope you get the points of error. Hence requested to do the coding in such a way that, which only generates positive values with array indexing.
:)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!