function [v, dv] = extractTrapFrequency(Positions, TrappingPotential, options)
    % EXTRACTTRAPFREQUENCY - Extract the trapping frequency by fitting a harmonic potential.
    %
    % [v, dv, popt, pcov] = EXTRACTTRAPFREQUENCY(Positions, TrappingPotential, axis)
    %
    % Parameters:
    %   Positions        - 2D matrix containing the positions of the atoms/particles.
    %   TrappingPotential - Vector containing the potential values for the corresponding positions.
    %   axis             - Index of the axis (1, 2, or 3) to extract the frequency.
    %
    % Returns:
    %   v    - Extracted trapping frequency.
    %   dv   - Error/uncertainty in the frequency.
    %   popt - Optimized parameters from the curve fitting.
    %   pcov - Covariance matrix from the curve fitting.
    
    axis    = options.Axis;

    tmp_pos = Positions(axis, :);
    tmp_pot = TrappingPotential(axis, :);

    % Find the index of the potential's minimum (trap center)
    [~, center_idx] = min(tmp_pot);

    % Define a range around the center for fitting (1/100th of the total length)
    lb = round(center_idx - length(tmp_pot)/200);
    ub = round(center_idx + length(tmp_pot)/200);

    % Ensure boundaries are valid
    lb = max(lb, 1);  % Lower bound cannot be less than 1
    ub = min(ub, length(tmp_pot));  % Upper bound cannot exceed length

    % Extract the subset of position and potential data around the center
    xdata = tmp_pos(lb:ub);
    Potential = tmp_pot(lb:ub);
    
    % Perform curve fitting using harmonic potential
    try
        % Define the fit model, treating 'm' as a fixed constant
        harmonic_potential = fittype(@(v, xoffset, yoffset, m, pos) Potentials.generateHarmonicPotential(pos, v, xoffset, yoffset, m), ...
                  'independent', 'pos', ...
                  'coefficients', {'v', 'xoffset', 'yoffset'}, ...
                  'problem', 'm');

        % Fit the potential data to the harmonic potential model
        fitObject   = fit(xdata(:), Potential(:), harmonic_potential, 'StartPoint', [1e3, tmp_pos(center_idx), -100], 'problem', options.Mass);
        
        % Get 95% confidence intervals (default)
        ci          = confint(fitObject); 
        
        % Extract the parameter values and their uncertainties
        params      = coeffvalues(fitObject);  % Extract the fitted parameter values
        lower_bound = ci(1, :);           % Lower bound of the confidence intervals
        upper_bound = ci(2, :);           % Upper bound of the confidence intervals
        
        % Compute the uncertainties (standard error can be estimated as half the width of the CI)
        uncertainties = (upper_bound - lower_bound) / 2;

        v  = fitObject.f;  % Extract fitted frequency
        dv = NaN;             % Uncertainty in the frequency
    catch
        % In case of fitting failure, return NaNs
        v  = NaN;
        dv = NaN;
    end
end