/**************************************************************************** * TrimFFT * Trim FFT array prior to Lorentzian fitting based on user specifications ****************************************************************************/ public FFTData TrimFFT(FFTData fftData, LorentzSettings lorentzSettings) { FFTData fftTrimData = new FFTData(); int startIndex = Array.FindIndex(fftData.freq, x => x >= lorentzSettings.trimStartFreq); int stopIndex = Array.FindIndex(fftData.freq, x => x >= lorentzSettings.trimStopFreq); fftTrimData.fft = fftData.fft.ToList().Skip(startIndex + 1).Take(stopIndex - startIndex).ToArray(); fftTrimData.freq = fftData.freq.ToList().ToList().Skip(startIndex + 1).Take(stopIndex - startIndex).ToArray(); return(fftTrimData); }
// LORENTZIAN FITTING // /**************************************************************************** * GetLorentzParams * Get lorentzian fitting parameters ****************************************************************************/ public void GetLorentzParams(FFTData fftData, LorentzSettings lorentzSettings, ref LorentzParams lorentzParams) { double[][] dataPoints = new double[][] { fftData.freq, fftData.fft }; LMA algorithm; if (lorentzSettings.isYShiftLorentz) { LMAFunction lorentzShift = new LorenzianFunctionShift(); double[] startPoint = new double[4]; try { startPoint[0] = lorentzSettings.startPointLP.A; } catch (Exception) { startPoint[0] = 10; } try { startPoint[1] = lorentzSettings.startPointLP.f0; } catch (Exception) { startPoint[1] = 25; } try { startPoint[2] = lorentzSettings.startPointLP.gamma; } catch (Exception) { startPoint[2] = 1; } try { startPoint[3] = lorentzSettings.startPointLP.up; } catch (Exception) { startPoint[3] = 1; } algorithm = new LMA(lorentzShift, startPoint, dataPoints, null, new GeneralMatrix(4, 4), 1d - 20, lorentzSettings.nIter); algorithm.Fit(); lorentzParams.A = algorithm.Parameters[0]; lorentzParams.gamma = algorithm.Parameters[2]; lorentzParams.f0 = algorithm.Parameters[1]; lorentzParams.up = algorithm.Parameters[3]; } else { LMAFunction lorentz = new LorenzianFunction(); double[] startPoint = new double[3]; try { startPoint[0] = lorentzSettings.startPointLP.A; } catch (Exception) { startPoint[0] = 10; } try { startPoint[1] = lorentzSettings.startPointLP.f0; } catch (Exception) { startPoint[1] = 25; } try { startPoint[2] = lorentzSettings.startPointLP.gamma; } catch (Exception) { startPoint[2] = 1; } algorithm = new LMA(lorentz, startPoint, dataPoints, null, new GeneralMatrix(3, 3), 1d - 20, lorentzSettings.nIter); algorithm.Fit(); lorentzParams.A = algorithm.Parameters[0]; lorentzParams.gamma = algorithm.Parameters[2]; lorentzParams.f0 = algorithm.Parameters[1]; lorentzParams.up = 0; } }