view aim-mat/modules/usermodule/pitchstrength/analyse_frequency_profile.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents
children
line wrap: on
line source
% function [result, center_c] = analyse_frequency_profiletunedDP(fq_profile, peaks, apFQP)
% 
%   To analyse the time frequency profile of the auditory image
%   Returns value between 0 and 1 discribing the strength of the spectral
%   pitch. Used for quantitative analysis of ramped and damped sinusoids
%   and for sinusoidally amplitude modulated sinusoids
%
%
%   INPUT VALUES:
%       fq_profile      frequency profile (signal class)
%       peaks           output of peakpicker
%       apFQP           a priori information where to find the peak
%  
%   RETURN VALUE:
%       result      all relevant information 
%
% 
% (c) 2011, University of Southampton
% Maintained by Stefan Bleeck (bleeck@gmail.com)
% download of current version is on the soundsoftware site: 
% http://code.soundsoftware.ac.uk/projects/aimmat
% documentation and everything is on http://www.acousticscale.org

function result = analyse_frequency_profile(fq_profile, options)

% for debug reasons -
plot_switch = 0;


% these finally are the results, that we want back: 
% 1:the hight at the highest point
result.free.highest_peak_hight=0;
result.free.highest_peak_frequency=0;
% hight to the region below value
result.free.height_width_ratio=0;

% now all these at a fixed frequency:
result.fixed.highest_peak_hight=0;
result.fixed.highest_peak_frequency=0;
result.fixed.height_width_ratio=0;

% other things useful for plotting
result.smoothed_signal=fq_profile; % no smoothing used here
result.peaks = [];


% first find the peaks of the frequency profile
peaks = PeakPicker(fq_profile);

% translate the time in the peaks back to a frequency
nap=options.nap;    % ugly, but we need the frequency informatin somewhere
for i=1:length(peaks)
    peaks{i}.t=1/chan2fre(nap,peaks{i}.x);
end

result.peaks = peaks;

fq_profile_vals = getdata(fq_profile);
if plot_switch
    cf_save = gcf;
    figure(13)
    cla;
    plot(fq_profile_vals,'r-');
    hold on
    axis auto
end
% stop if there are no peaks, e.g. in the first frames
if length(peaks)<1
    return
end

% Peak of interest is highest peak of the profile
peaks_oi = peaks{1};

apFQP=options.target_frequency;
if apFQP>0
    % no peak finding - peak is given a priori
    % take nearest peak to a apriori frequency
    dist=+inf;
    indexOI = 1;
    for p=1:length(peaks)
        d=abs(apFQP-peaks{p}.t);
        if d<dist
            indexOI=p;     
            dist=d;
        end
    end %p
    peak_oi = peaks{indexOI};
end


% %%  Method --- works with SAM sounds
% %%  Highest peak / number of neighbourgh channels which are bigger than -xdB
% max_attenuation_dB = -6;
% atten_fac = 10^(max_attenuation_dB/20);  % attenuation as factor
% % Take highest Peak
% %poi = peaks2{1};
% %poi = peaks{1};
% poi = peaks_oi;
% 
% fq_profile_vals = fq_profile_vals./poi.y;
% maxy =1;
% % maxy = poi.y;
% pwidth = 0;
% x = poi.x;
% while (x<=length(fq_profile_vals))&&(fq_profile_vals(x)>maxy*atten_fac)
%     pwidth=pwidth+1; % one more channel
%     x=x+1;
% end
% if plot_switch
%   line([x x],[0 peaks_oi.y]);
% end
% 
% x = poi.x-1;
% while (x>=1)&&(fq_profile_vals(x)>maxy*atten_fac)
%     pwidth=pwidth+1; % one more channel
%     x=x-1;
% end
% if plot_switch
%   line([x x],[0 peaks_oi.y]);
% end
% result_width =  1-(pwidth/length(fq_profile_vals));
% 

% ----------------------------
% Method developed with Roy 13/06
% Calculate the mean of the Channels in a 20 to 80 percent
% range left of the main peak

start_frequency_integration=options.start_frequency_integration;
stop_frequency_integration=options.stop_frequency_integration;

startx=floor(start_frequency_integration*peaks_oi.x);
if startx<=0
    startx=1;
end
stopx=floor(stop_frequency_integration*peaks_oi.x);
ps_result = 1 - mean(fq_profile_vals(startx:stopx))/fq_profile_vals(peaks_oi.x);

center_c = peaks_oi.x;

if plot_switch
  plot(peaks_oi.x,peaks_oi.y,'r.');
  plot(startx,fq_profile_vals(startx),'bx');
  line([startx startx],[0 fq_profile_vals(startx)])
  plot(stopx,fq_profile_vals(stopx),'bx');
  line([stopx stopx],[0 fq_profile_vals(stopx)])
  figure(cf_save);
end

% % % For debug plot minima
% for i=1:nops
%     plot(peaks{i}.left.x, peaks{i}.left.y, 'ob');
%     plot(peaks{i}.right.x, peaks{i}.right.y, 'xb');
% end


% finally define the return values 
result.free.highest_peak_hight=peaks_oi.y; % height of the first peak
result.free.highest_peak_frequency=chan2fre(nap,peaks_oi.x);

% hight to the region below value
result.free.height_width_ratio=ps_result;

% now all these at a fixed frequency:
result.fixed.highest_peak_hight=0;
result.fixed.highest_peak_frequency=0;
result.fixed.height_width_ratio=0;