A simple example to illustrate this problem using two time signals with different bandwidths, with and without noise added.
using DSP, FFTW
sweep(t,t0,t1,f0,f1) = (t0 < t < t1) ? sin(2π*(t-t0)*(f0 + 0.5*(f1 - f0)/(t1 - t0)*(t - t0))) : 0.0
Δt = 0.004 # sample period (s)
n = 500
t = 0:Δt:(n-1)*Δt
nl = [0.05, 0.0] # 5% noise level and noise-free
ϵ = 0.1; # white noise for deconvolution
s1 = [sweep.(t,0.5,1.5,8.,64.) .+ nl*(2*rand(n) .- 1) for nl in nl] # add random noise
s2 = [sweep.(t,0.,0.5,8.,36.) .+ nl*(2*rand(n) .- 1) for nl in nl] # add random noise
xc = [xcorr(s1,s2)[n:end] for (s1,s2) in zip(s1,s2)] # xcorr's length = 2*n - 1, cut to length n
f = LinRange(-0.5/Δt, 0.5/Δt, n+1)[n÷2+1:end]
S1 = fft.(s1); S1a = [fftshift(abs.(S1))[n÷2:end] for S1 in S1]
S2 = fft.(s2); S2a = [fftshift(abs.(S2))[n÷2:end] for S2 in S2]
Xc = fft.(xc); Xca = [fftshift(abs.(Xc))[n÷2:end] for Xc in Xc]
# deconvolve Xc for S2
S2_decon = [@. conj(Xc)*S1 / (S1*conj(S1) + ϵ^2) for (S1,Xc) in zip(S1,Xc)]
S2a_decon = [fftshift(abs.(S2_decon))[n÷2:end] for S2_decon in S2_decon]
s2_decon = [real(ifft(S2_decon)) for S2_decon in S2_decon]
# deconvolve Xc for S1
S1_decon = [@. Xc*S2 / (S2*conj(S2) + ϵ^2) for (S2,Xc) in zip(S2,Xc)]
S1a_decon = [fftshift(abs.(S1_decon))[n÷2:end] for S1_decon in S1_decon]
s1_decon = [real(ifft(S1_decon)) for S1_decon in S1_decon]
Input signals with and without noise, their cross-correlations and respective spectra:
Deconvolution to obtain narrower band S2 (left with noise, right without):
Deconvolution to obtain wider band S1 (left with noise, right without):