From 21c5f04bb36ec90587778a77334c07ce7ab8c8a1 Mon Sep 17 00:00:00 2001 From: Ling Sun <featherlet.sun@gmail.com> Date: Fri, 29 Jul 2016 08:13:11 +1000 Subject: [PATCH] adjust variable names, minor changes --- binary_fstat.m => binaryfilter.m | 25 +++++++++++++------------ functions/argmax.m | 4 ++-- readfstats.m | 13 ++++++------- search_O1.m | 25 +++++++++++++------------ viterbi_colFLT.m | 26 +++++++++++++++----------- 5 files changed, 49 insertions(+), 44 deletions(-) rename binary_fstat.m => binaryfilter.m (68%) diff --git a/binary_fstat.m b/binaryfilter.m similarity index 68% rename from binary_fstat.m rename to binaryfilter.m index bbe75be..9eb2950 100644 --- a/binary_fstat.m +++ b/binaryfilter.m @@ -1,5 +1,5 @@ -function [b,h] = binary_fstat(f,f0,P,a0) -% Generate the Bessel-weighted matched filter (also generate Comb filter) +function [b,h] = binaryfilter(f,f0,P,a0) +% BINARYFILTER Generate the Bessel-weighted matched filter (also generate Comb filter) % % Inputs: % f - Frequency bin list (i.e. hidden stats) @@ -11,23 +11,24 @@ function [b,h] = binary_fstat(f,f0,P,a0) % b - Bessel-weighted matched filter % h - Comb filter (not used in the current search) + % Fstat power concentrated at [-c c]/P where c = 2*pi*a0*f0 % f0 is fixed to setup matched filter for each 1-Hz sub-band -c=(2*pi*a0*f0); +c = 2*pi*a0*f0; % Make it slightly wider than c -N=ceil(c)+100; -n=-N:N; -b0=besselj(n,c); -M=length(f); +N = ceil(c)+100; +n = -N:N; +b0 = besselj(n,c); +M = length(f); % Identify the indices to place the matched filter in the 1-Hz band % k indicates the interpolated indices at query points n/P using nearest interpolation, 1 is the extrapval for out of range values -k=interp1(f-mean(f),1:M,n/P,'nearest',1); +k = interp1(f-mean(f),1:M,n/P,'nearest',1); % Initialise the 1-Hz band matched filter -b=zeros(M,1); +b = zeros(M,1); % Place the filter -b(k)=abs(b0).^2; +b(k) = abs(b0).^2; % h is comb matched filter, not used in the search -h=zeros(M,1); -h(k)=1; +h = zeros(M,1); +h(k) = 1; diff --git a/functions/argmax.m b/functions/argmax.m index 309466d..9e0609f 100644 --- a/functions/argmax.m +++ b/functions/argmax.m @@ -1,2 +1,2 @@ -function j=argmax(L); -[~,j]=max(L); \ No newline at end of file +function j = argmax(L); +[~,j] = max(L); \ No newline at end of file diff --git a/readfstats.m b/readfstats.m index 4203546..234ee2c 100644 --- a/readfstats.m +++ b/readfstats.m @@ -1,5 +1,5 @@ -function [f,X,N,T]=readfstats(dirName, startFreq, steps) -% Read Fstat files +function [f, X, N, T] = readfstats(dirName, startFreq, steps) +% READFSTATS Read Fstat files % % Inputs: % dirName - Directory of Fstat files @@ -13,14 +13,13 @@ function [f,X,N,T]=readfstats(dirName, startFreq, steps) % N - Number of bins % T - Total number of steps -d = dir(dirName); -X = []; -for n=1:steps - fileName=['Fstat-' num2str(startFreq) '-' num2str(n-1) '.dat'] +X = []; +for n = 1:steps + fileName = ['Fstat-' num2str(startFreq) '-' num2str(n-1) '.dat'] try - fstatData=load([dirName fileName]); + fstatData = load([dirName fileName]); X(:,n) = fstatData(:,7); f = fstatData(:,1); catch diff --git a/search_O1.m b/search_O1.m index 7ab37f1..7d560fc 100644 --- a/search_O1.m +++ b/search_O1.m @@ -1,5 +1,5 @@ function search_O1(freq,idx) -% This script is for O1 Sco X-1 search. +% SEARCH_O1 This script is for O1 Sco X-1 search. % The search is separated into parallel 1-Hz sub-jobs. % The start frequency for each sub-job is the overal start frequency plus job index. % @@ -11,6 +11,7 @@ function search_O1(freq,idx) % Outputs: % Save output files to the output directory. + format long g startFreq = str2num(freq) + str2num(idx) @@ -21,7 +22,7 @@ outdir = '/home/ling.sun/O1/Viterbi/output/'; outfile = strcat(outdir,'Viterbi-', num2str(startFreq),'.dat') % Set parameters -a = 1.44 +a0median = 1.44 P = 68023.70496 steps = 13 @@ -30,32 +31,32 @@ tic [f,X]=readfstats(dirName, startFreq, steps); toc -fmean=f(1)+0.5; % Take the mean value of each 1-Hz sub-band -g=[-0.1:0.01:0.1]; % asini grid (+/-10% uncertainty, may search larger uncertainty) -a0=(1+g)*a; % asini values being searched +fmean = f(1)+0.5; % Take the mean value of each 1-Hz sub-band +g = [-0.1:0.01:0.1]; % asini grid (+/-10% uncertainty, may search larger uncertainty) +a0 = (1+g)*a0median; % asini values being searched for m=1:length(g) disp(sprintf('a0=%g',a0(m))) + tic % Generate Bessel-weighted matched filter - [b,h] = binary_fstat(f,fmean,P,a0(m)); + [b,h] = binaryfilter(f,fmean,P,a0(m)); % Compute Bessel-weighted Fstat for n=1:steps - Y(:,n)=fftshift(ifft(fft(X(:,n)).*fft(b))); + Y(:,n) = fftshift(ifft(fft(X(:,n)).*fft(b))); end - [path0(m,:),delta,psi,sc(m)] = viterbi_colFLT(3, Y); - + [path0(m,:), delta, psi, sc(m)] = viterbi_colFLT(3, Y); toc end % Get the optimal path for all asini searched -[maxsc,a0ind]=max(sc) -path=path0(a0ind,:) +[maxsc, a0ind] = max(sc) +path = path0(a0ind,:) % Save output file for each 1-Hz sub-band -fid=fopen(outfile,'wt'); +fid = fopen(outfile,'wt'); fprintf(fid,'StartFreq\t%g\n',startFreq); fprintf(fid,'Score\t%g\n',maxsc); fprintf(fid,'Bin_a0\t%g\n',a0ind); diff --git a/viterbi_colFLT.m b/viterbi_colFLT.m index a10375c..7d85c20 100644 --- a/viterbi_colFLT.m +++ b/viterbi_colFLT.m @@ -1,5 +1,5 @@ function [path,delta,psi,score] = viterbi_colFLT(M, obslik) -% VITERBI Find the most-probable (Viterbi) path through the HMM states (frequency bins). +% VITERBI_COLFLT Find the most-probable (Viterbi) path through the HMM states (frequency bins). % % Inputs: % M - One dimension of the colfilt matrix, in the current model M=3, @@ -13,10 +13,13 @@ function [path,delta,psi,score] = viterbi_colFLT(M, obslik) % psi(j,t) - The best predecessor state, given that we ended up in state j at t % score - Number of standard deviations above the mean value of log likelihood % of paths to all the states at the final step - + -if round(M/2)==M/2 M=M+1;end -[Q,T]=size(obslik); % Q bins, T steps +if round(M/2)==M/2 + M = M+1; +end + +[Q,T] = size(obslik); % Q bins, T steps delta = zeros(Q,T); psi = zeros(Q,T); @@ -27,23 +30,24 @@ path = zeros(1,T); % the max or argmax function to this matrix. This function actually % compares all three possible paths for each step and the operation % is efficient. - -t=1; + +cor = (0:Q-1)'-(M-1)/2; % correction term for each bin + +t = 1; delta(:,t) = obslik(:,t); -cor=(0:Q-1)'-(M-1)/2; % correction term for each bin disp('forward') for t=2:T - delta(:,t) = colfilt(delta(:,t-1),[M 1],'sliding',@max)+obslik(:,t); - psi(:,t) = colfilt(delta(:,t-1),[M 1],'sliding',@argmax)+cor; + delta(:,t) = colfilt(delta(:,t-1),[M 1],'sliding',@max) + obslik(:,t); + psi(:,t) = colfilt(delta(:,t-1),[M 1],'sliding',@argmax) + cor; end % Sort the paths disp('backward') % Only identify the optimal path -[sc,path(T)]=max(delta(:,T)); -score=(sc-mean(delta(:,T)))/std(delta(:,T)); +[sc, path(T)] = max(delta(:,T)); +score = (sc-mean(delta(:,T)))/std(delta(:,T)); for t=T-1:-1:1 path(t) = psi(path(t+1),t+1); -- GitLab