Thursday, 4 December 2014

How to read a formatted text (ASCII) file in Matlab?

1. If a text (ASCII) file contains data with different data types then 'load' command is not useful. Then, one option can be to use TEXTSCAN with the format specifier as shown below.


fid = fopen(fileName)
formatSpec = '%f %s %f %f'

data = textscan(fid,formatSpec,3600*1,'Delimiter',',','CollectOutput', true);

fclose(fid)

The output will be a cell array. Each cell contains each of the elements. If you...
CollectOutput - will collect the consecutive data of same type in a single cell array.
Delimiter - lets you specify the delimiter used in the text file. If do not use the 'Delimiter' option then space is treated as the delimiter.


2. Many examples are given in the Matlab link given above:


Friday, 21 November 2014

How to stop Matlab at the point of error for debugging?

1. There is an useful command 'dbstop'. Check help for more details.

2. To stop the control at the point of error in part of the function or the script use

dbstop if error

3. This has to be only once in the file. It gets applied to all the files.

4. Quite useful. Avoids rerunning the script to look for the reasons for the errors. It stops the control at the line where error is encountered and retains the work-space variables that belong to that function.


Thursday, 13 November 2014

How to design a simple low pass filter (LPF) in Matlab?

%% LPF filter specifications

fSamp = 45e6;

Fpass = 1.25e6/(fSamp/2);          % Passband Frequency
Fstop = 2.5e6/(fSamp/2);        % Stopband Frequency
Apass = 1;           % Passband Ripple (dB)
Astop = 80;          % Stopband Attenuation (dB)
match = 'passband';  % Band to match exactly

% Construct an FDESIGN object and call its BUTTER method.
%d  = fdesign.lowpass(Fpass, Fstop, Apass, Astop, fSamp);
d=fdesign.lowpass('Fp,Fst,Ap,Ast',Fpass,Fstop,Apass,Astop);
designmethods(d)
Hd = design(d,'equiripple');
fvtool(Hd); %shows the response

%Using filter

inpSignalFiltered = filter(Hd, inpSignal);




Wednesday, 6 August 2014

How to add colorbar ( adjust its size and label) to a plot in Matlab?

1. Use 'colorbar'

c=colorbar('vert'); % vert adds colorbar to z-axis values. 'horiz' adds color bar to x-values.

2. Reduce the size of the colorbar

xa1=get(gca,'position');
xa=get(c,'Position');
xa(3)=0.03;
xa(4)=0.65;

set(c,'Position',xa)

3. Adding title to the colorbar (this sits on top)

title(c,'Hz')

4. Adding ylabel to it (along vertical axis)

ylabel('Error')

Example:


Thursday, 29 May 2014

How to get all the elements of a structure into single array, in Matlab?

 %Structure definition


% Case 1: Each element in the structure has same number of columns but different
% number of rows.

a(1).res = ones(4,2)*100;
a(2).res = ones(2,2)*2;
a(3).res = ones(3,2)*40;
a(4).res = ones(5,2)*253;

% For Case 1, [a.res] = horzcat will not work because it requires rows of
% all the elements in the structure to be equal. However, we can do
% vertical concatenation as columns of all the elements are equal.


vertCatAres = vertcat(a.res)

%Case 2: Each element in the structure has same number of rows but
%different number of columns

a(1).res = ones(2,4)*100;
a(2).res = ones(2,2)*2;
a(3).res = ones(2,3)*40;
a(4).res = ones(2,5)*253;
horzCatAres = [a.res] % horzcat(a.res)

%Results
vertCatAres =
   100   100
   100   100
   100   100
   100   100
     2     2
     2     2
    40    40
    40    40
    40    40
   253   253
   253   253
   253   253
   253   253
   253   253

horzCatAres =
   100   100   100   100     2     2    40    40    40   253   253   253   253   253
   100   100   100   100     2     2    40    40    40   253   253   253   253   253

Friday, 28 March 2014

How to go to a particular byte in a file in Matlab?

1. Use fseek

2. Note: 
a. In file, byte numbering starts from 0. Therefore, if we want to go to Nth byte, then we have to move the pointer by (N-1) bytes.

fseek(fid, N-1,'bof'); %skips (N-1) bytes and points to Nth byte of the data.

b. In file, byte numbering starts from 0. Therefore, if we want to remove N bytes, move the pointer by N bytes.

fseek(fid, N,'bof'); % skips N bytes and points to N+1 byte of the data.

c. The N has to be an integer.

3. Example: 

status =  fseek(fid3, floor(numberOfBytesToSkipFromBOFFor20msIntAlignment), 'bof')

ferror(fid3) ; % ferror gives more information if there is any error during fseek operation.

status = 1 means successful operation else there is an error.

Tuesday, 11 March 2014

How to put legends only to some of the lines in a Matlab Plot?

1. Use the 'plot' handles.

x1 = 1:10;
y1blue = 2 .* x1;


y2green = 2 .* y1;

y3red = y2 + 5;

h1 = plot(x1,y1blue ,'b');
hold on;

h2 = plot(y2green,'g');
h3 = plot(y3red,'r');

%Legend all the line plots
legend('Y1blue','Y2green', 'Y3red');


%Legend only Y1 and Y2
legend([h1 h2],{'Y1','Y2'});

2. Another method to control the 'legend content' is given HERE


3. How to use numbers in the legend?

legend({['PRN' num2str(1)],['PRN' num2str(2)]});