Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正弦曲线的线性/非线性拟合_C_Algorithm_Curve Fitting - Fatal编程技术网

C 正弦曲线的线性/非线性拟合

C 正弦曲线的线性/非线性拟合,c,algorithm,curve-fitting,C,Algorithm,Curve Fitting,我已经看了一眼了 但我有一个稍微不同的问题。我知道我的数据是一条正弦曲线,周期未知,振幅未知,带有加性非高斯分布噪声 我试图用C语言中的非线性算法来拟合它,但是拟合效果非常糟糕。我想知道我是否(错误地)使用了非线性拟合算法,而我应该使用线性拟合算法 如何判断特定数据集需要线性算法还是非线性算法 编辑:我的曲线非常嘈杂,因此使用FFT计算频率可能会导致误报和不匹配。我正在寻找一种更为稳健的拟合方式 如你所见,上面的图大约有170个点,下面的图大约有790个点 噪声明显是非高斯的,与数据的振幅相

我已经看了一眼了

但我有一个稍微不同的问题。我知道我的数据是一条正弦曲线,周期未知,振幅未知,带有加性非高斯分布噪声

我试图用C语言中的非线性算法来拟合它,但是拟合效果非常糟糕。我想知道我是否(错误地)使用了非线性拟合算法,而我应该使用线性拟合算法

如何判断特定数据集需要线性算法还是非线性算法

编辑:我的曲线非常嘈杂,因此使用FFT计算频率可能会导致误报和不匹配。我正在寻找一种更为稳健的拟合方式

如你所见,上面的图大约有170个点,下面的图大约有790个点

噪声明显是非高斯的,与数据的振幅相比较大。我在高斯分布噪声上尝试过FFT,我的拟合非常好。在这里,它的失败相当严重


添加:链接到时间序列数据。文件中的每列都是不同的时间序列

如果在sin上进行回归,可以使用FFT进行傅里叶变换

编辑

试着用过滤器去除噪音。若你们有像传感器这样的物理源,那个么在传感器上安装低通滤波器。FFT是相对较差的滤波器

EDIT2-此测量值完全错误

这可能是,你做了错误的测量。根据您的采样频率过低,或输入频率过高。这将导致错误的解决方案,因为如果您使用5kHz采样进行3kHz采样,您将根据该定理测量2kHz


我确信你不能通过这种测量来判断正确的输入频率。

Kitchi:你能提供一些样本数据吗?您必须使用的典型信号有多长时间?(根据采样数和正弦波周期数)以dB为单位的信噪比是多少

  • 在您知道什么algo可以工作之前,我建议您使用python/numpy/scipy(或matlab/octave,或R/S,或Mathematica…)对其进行原型化,无论您最喜欢的原型化语言/工具集是什么,而不是C。这将节省大量时间,并且您将使用更丰富的工具

  • 你确定噪音会严重影响FFT吗?这不一定是一个好的假设,尤其是当噪声相对“白色”且分析窗口较长时。如果正弦波的频率非常稳定,你可以做一个巨大的FFT,从比信号强几个数量级的噪声中提取信号。试着以预期正弦波的几百到几百万个周期来做一些事情

  • 曲线拟合正弦波就是不能很好地工作。我猜周期性会产生很多局部极小值,而相移变量也会使问题显著非线性。您可以从下面链接的遇到相同问题的其他人那里看到一些问题。你最好尝试其他任何方法,而不是非线性最小二乘拟合,除非你将问题预线性化,这让我想到

  • 对于这类事情,自相关是非常好的。尝试一次计算整个信号的自相关(如果源频率稳定,数据越多越好)。正弦波周期作为自相关中的一个高峰应该非常明显,并且您可能会得到比FFT更精确的频率估计(除非您使用非常大的FFT)。此外,还可以从第一个高自相关峰的高度计算平均振幅

  • 编辑:经过进一步研究,有更多的技术可能比FFT更适合您的问题。皮萨连科的谐波分解(首先由弗雷德里克·鲁宾提出)就是其中之一;另一个是(LSSA),它与您最初的问题想法非常相似。LSSA有许多变体,例如Lomb Scargle、basis pursuit等,它们以各种方式处理我上面描述的拟合问题。然而,我认为,如果你在大型FFT中完全看不到任何信号,那么其他方法也不可能找到任何东西:)

    另外,有关无法很好地拟合正弦波的其他问题,请参见:


    如果你知道你的数据是一条正弦曲线(可以用许多复指数表示),那么你可以使用Pisarkenko的谐波分解

    然而,如果您可以访问更多的数据点,我的方法仍然是使用DFT

    更新:

    我在你的数据上使用了Pisarenko的谐波分解(PHD),即使你的信号非常短(每个只有86个数据点),如果有更多的数据可用,PHD算法肯定有潜力。以下是24个信号中的两个(数据的第11列和第13列),用蓝色表示,红色的正弦曲线对应于PHD估计的振幅/频率值。(请注意,相移未知)

    我使用MATLAB(pisar.m)执行博士学位:

    导致

    1.9727     % amp. for  column 11
    0.1323     % freq. for column 11
    2.3231     % amp. for  column 13
    0.1641     % freq. for column 13
    
    博士学位验证:

    我还做了另一个测试,在那里我知道振幅和频率的值,然后添加噪声,看看PHD是否能从噪声信号中正确估计值。该信号由两条附加正弦曲线组成,频率分别为50 Hz和120 Hz,振幅分别为0.7和1.0。在下图中,红色的曲线是原始曲线,蓝色的曲线带有附加噪声。(图已裁剪)

    PHD估计安培/频率值为:

    0.7493    % amp wave 1  (actual 0.7)
    0.9257    % amp wave 2  (actual 1.0)
    58.5      % freq wave 1 (actual 50)
    123.8     % freq wave 2 (actual 120)
    
    对于相当多的噪声来说,这并不坏,而且只知道信号包含的波的数量

    回复@Alex:

    是的,它是一个n
    Fs = 1000; % Sampling frequency
    T = 1/Fs; % Sample time
    L = 1000; % Length of signal
    t = (0:L-1)*T; % Time vector
    
    % Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
    x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
    y = x + 0.4*randn(size(t)); % Sinusoids plus noise
    
    figure;
    plot(Fs*t(1:100),y(1:100)); hold on; plot(Fs*t(1:100),x(1:100),'r')
    title('Signal Corrupted with Zero-Mean Random Noise (Blue), Original (Red)')
    
    [A, f] = pisar(y',2); 
    disp(A)
    disp(f/Fs)
    
    0.7493    % amp wave 1  (actual 0.7)
    0.9257    % amp wave 2  (actual 1.0)
    58.5      % freq wave 1 (actual 50)
    123.8     % freq wave 2 (actual 120)