function showEQNoiseSNR(eq_signal, noise_signal, options) arguments eq_signal noise_signal options.fs_tx options.fs_rx options.fignum (1,1) double = NaN % Default to NaN if not provided options.displayname (1,:) char = '' % Default to an empty string if not provided options.color = []; options.linestyle = '-'; end % Determine the figure number to use or create a new figure if isnan(options.fignum) fig = figure; % Create a new figure and get its handle else fig = figure(options.fignum); % Use the specified figure number end if isa(eq_signal,'Signal') options.fs_tx = eq_signal.fs; eq_signal = eq_signal.signal; end if isa(noise_signal,'Signal') options.fs_rx = noise_signal.fs; noise_signal = noise_signal.signal; end hold on ax = gca; % N = numel(ax.Children); if isempty(options.color) N = sum(arrayfun(@(x) strcmp(x.LineStyle, '-'), ax.Children)); cmap = linspecer(8); options.color = cmap(mod(N, size(cmap, 1)) + 1, :); end fft_length = 2^(nextpow2(length(eq_signal))-7); [s_lin,w] = pwelch(eq_signal,hanning(fft_length),fft_length/2,fft_length,options.fs_tx,"centered","psd","mean"); [n_lin,w_noise] = pwelch(noise_signal,hanning(fft_length),fft_length/2,fft_length,options.fs_rx,"centered","psd","mean"); if numel(w_noise) ~= numel(w) || any(abs(w_noise - w) > max(options.fs_tx,options.fs_rx)*eps) n_lin = interp1(w_noise,n_lin,w,"linear",NaN); end w = w.*1e-9; snr_lin = s_lin./n_lin; snr_lin = movmean(snr_lin,10); snr_dbm = 10*log10(snr_lin); if isempty(options.displayname) options.displayname = 'SNR'; end plot(w,snr_dbm,'DisplayName',options.displayname,'LineWidth',1,'Color',options.color,'LineStyle',options.linestyle); % yline(mean(snr_dbm),'HandleVisibility','off','Color',options.color,'LineStyle','--','LineWidth',1); xlabel("Frequency in GHz"); ylabel("SNR (dB)"); xlim([min(w) max(w)]); y_min = min(snr_dbm(:)); y_max = max(snr_dbm(:)); y_range = y_max - y_min; if y_range == 0 y_range = 10; end y_margin = 0.05 * y_range; ylim([y_min - y_margin, y_max + y_margin]); try yticks(round(linspace(y_min, y_max, min(10, max(4, ceil(y_range/10)))))); end grid on; if isempty(get(gca, 'Legend')) legend('Interpreter','none'); end end