matlab模糊函数

matlab中模糊函数的实现

%{  
    模糊函数
    paraInput:
            signal :1*N matrix
            fs     :double
            Doppler cut: hz
                       指示多普勒维度上显示位置
                       默认为中间
            dalay cut : ms
                        指示时延维度上的显示位置
                       默认为中间
            Max_doppler :   多普勒维最大点数
            Max_delay :     时延维最大点数
            default_cut: 当信号长度大于时延维最大点数时对信号的处理方式
                        "cut" :直接阶段信号
                        "resample":对信号重采样
    returntype:

            ambiguity(signal, fs, varargin);
            ambi = ambiguity(signal, fs, varargin); 此时不绘图
            [ambi, timeax] = ambiguity(signal, fs, varargin); 此时不绘图
            [ambi, timeax,fd] ambiguity(signal, fs, varargin); 此时不绘图

            ambi:模糊函数值
            timeax:时延轴
            fd:多普勒频移轴
        
%} 

function varargout = ambiguity(signal, fs, varargin)
p = inputParser;

addOptional(p, "dalay_cut", 0);
addOptional(p, "Doppler_cut",0);
addOptional(p, "Max_doppler",1000,@(x)validateattributes(x,{'numeric'},{'nonnegative'}));
addOptional(p, "Max_delay",1000,@(x)validateattributes(x,{'numeric'},{'nonnegative'}));
addOptional(p, "default_cut","cut",@(s)isstring(s));
parse(p,varargin{:});

Max_doppler = floor(p.Results.Max_doppler);
Max_delay = floor(p.Results.Max_delay);

if Max_doppler <= 1 || Max_delay<= 1
    ME = MException('myComponent:inputError','最大点数太小');
    throw(ME);
end

[m, len] = size(signal);
if m > 1 && len > 1
    ME = MException('myComponent:inputError','signal must be 1 dimension');
    throw(ME);
elseif m > 1 && len == 1
    signal = signal';
    len=m;
elseif m == 0
    ME = MException('myComponent:inputError','signal is empty');
    throw(ME);
end

if len > Max_doppler
    Ndoppler = Max_doppler;
else 
    Ndoppler = len;
end
if len > Max_delay
    Ndelay = Max_delay;
    if strcmpi(p.Results.default_cut, "resample")
        signal = resample(signal, Max_delay, len);
    elseif strcmpi(p.Results.default_cut, "cut")
        signal = signal(1:Max_delay);
    end
else
    Ndelay = len;
end
fd=linspace(-fs/2,fs/2,Ndoppler);
t2=linspace(0,len/fs,Ndelay);

ambi = abs(xcorr2(bsxfun(@times,signal,exp(1j*2*pi*fd'*t2) ),signal));
timeax=[fliplr(-t2),t2(2:end)] * 1e3;

isplot = false;
if nargout == 0
    isplot = true;
elseif nargout == 1
    varargout{1} = ambi;
elseif nargout == 2
    varargout{1} = ambi;
    varargout{2} = timeax;
elseif nargout == 3
    varargout{1} = ambi;
    varargout{2} = timeax;
    varargout{3} = fd;
end

if isplot
    [~,DopplerPos] = min(abs(fd - p.Results.Doppler_cut));
    [~,DalayPos] = min(abs(timeax - p.Results.dalay_cut));
    freq = fd(DopplerPos);
    delay = timeax(DalayPos);

    figure(1);
    mesh(timeax,fd,ambi),grid on;
    xlabel('delay [ms]');
    ylabel('frequency[Hz]');
    zlabel('magnitude');
    title("ambiguity function");

    figure(2)
    plot(timeax, ambi(DopplerPos,:) )
    xlabel('delay [ms]');
    ylabel('magnitude');
    title(sprintf("dalay cut, Doppler shift freq=%.2fHz",freq) )

    figure(3)
    plot(fd, ambi(:,DalayPos) )
    xlabel('frequency[Hz]');
    ylabel('magnitude');  
    title(sprintf("Doppler cut,delay=%fms",delay) )

    figure(4)
    contour(timeax,fd,ambi)
    xlabel('frequency[Hz]');
    ylabel('delay [ms]');
    title("等高线图");
end
end

你可能感兴趣的:(matlab,matlab,信号处理,数学建模)