You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: td2fd.m
    path of file: ./repos/MERIT/+merit/+process
    
    the code of the file until where you have to start completion: function [signals_] = td2fd(signals, time_axis, frequency_axis)
  % merit.process.td2fd converts signals from the time domain to the frequency domain
  %   using the Chirp-Z transform (MATLAB implementation).
  %
  % signals = merit.process.td2fd(signals, time_axis, frequency_axis);
  %   signals: N_t x C x ... array
  %   signals_: N_f x C x ... array
  %   where:
  %     N_t is the number of time samples

    
function [signals_] = td2fd(signals, time_axis, frequency_axis)
  % merit.process.td2fd converts signals from the time domain to the frequency domain
  %   using the Chirp-Z transform (MATLAB implementation).
  %
  % signals = merit.process.td2fd(signals, time_axis, frequency_axis);
  %   signals: N_t x C x ... array
  %   signals_: N_f x C x ... array
  %   where:
  %     N_t is the number of time samples
  %     N_f is the number of frequency samples
  %     C is the number of channels
  %     time_axis is the set of time samples
  %     frequency_axis is the set of frequency samples

  %% Input validation
  validateattributes(signals, {'numeric'},...
    {'nrows', numel(time_axis), 'real'});
  validateattributes(time_axis, {'numeric'},...
    {'vector', 'increasing', 'real'});
  validateattributes(frequency_axis, {'numeric'},...
    {'vector', 'increasing', 'real'});

  if ~merit.utility.linearlysampled(time_axis)
    error('merit:process:td2fd', 'Time axis needs to be linearly sampled');
  end