Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Matlab 如何制作一个遵循某种趋势的向量?_Matlab_Signals_Signal Processing - Fatal编程技术网

Matlab 如何制作一个遵循某种趋势的向量?

Matlab 如何制作一个遵循某种趋势的向量?,matlab,signals,signal-processing,Matlab,Signals,Signal Processing,我有一组超过4000点的数据。我想把凹槽从它们身上剔除,最好从它们开始的那一点开始。例如,数据如下所示: 问题是我在高原顶部听到的噪音。我有一个想法,我会在一些边界内取最常见的平均值(同样,理想情况下,如红线: 然后我会构造一个临时矩阵,如果它们小于这个平均值,它会一个接一个地填充Y如果超过平均值,矩阵将找到它的极小值并与全局极小值进行比较。如果临时矩阵的极小值不是全局极小值的80%,它将作为噪声被丢弃 我试过使用均值(Y),插值并拟合成多项式(绿线)——这些方法都不能使我满意 我需要它非常

我有一组超过4000点的数据。我想把凹槽从它们身上剔除,最好从它们开始的那一点开始。例如,数据如下所示:

问题是我在高原顶部听到的噪音。我有一个想法,我会在一些边界内取最常见的平均值(同样,理想情况下,如红线:

然后我会构造一个临时矩阵,如果它们小于这个平均值,它会一个接一个地填充Y如果超过平均值,矩阵将找到它的极小值并与全局极小值进行比较。如果临时矩阵的极小值不是全局极小值的80%,它将作为噪声被丢弃

我试过使用均值(Y),插值并拟合成多项式(绿线)——这些方法都不能使我满意

我需要它非常坚固,不需要很快。顶部和底部的值可能会有很大的变化,以及高原的形状。凹槽的宽度大致相同

你有什么想法吗?再说一次,重点是提取出能形成凹槽的值。

一个如何

让我们定义一些类似于您的噪声数据,并用蓝色绘制:

x = .2*sin((0:9999)/1000);                         %// signal
x(1000:1099) = x(1000:1099) + sin((0:99)/50*pi);   %// noise: spike
x(5000:5199) = x(5000:5199) - sin((0:199)/100*pi); %// noise: wider spike
x = x + .05*sin((0:9999)/10);                      %// noise: high-freq ripple
plot(x)
现在应用中值滤波器(使用图像处理工具箱)并以红色绘制。参数
k
控制滤波器内存。与噪声变化相比,应选择较大的值,与信号变化相比,应选择较小的值:

k = 500; %// filter memory. Choose as needed
y = medfilt2(x,[1 k]);
hold on
plot(y, 'r', 'linewidth', 2)

以防您没有图像处理工具箱,无法使用更为手动的方法
medfilt2
时。跳过极值,并使用
sin1
作为曲线类型进行分析。请注意,这仅在信号实际上是正弦波时才起作用

x=linspace(0,3*pi,1000);

y1=sin(x)+rand()*sin(100*x)。*(mod(round(10*x),5)对不起,你说的凹槽是什么意思?在这种情况下,绘图的部分会比大部分绘图更深。在本例中,我会有10个凹槽。如果你只想识别“凹槽”你可以只做一个简单的平均值和标准偏差,然后分析你的数据。基本上:grooves=s这似乎是一个很好的解决方案。但是
'sin1'
选项是否会产生正弦输出?因为在这种情况下,如果数据不是正弦的,它可能无法找到一个很好的拟合(我没有Matlab R2010b中的
fit
函数,因此我无法测试)是的,它找到了正弦波近似值,因此如果数据不是周期性的,这种方法将不起作用。虽然包含的信号OP看起来是正弦的。+1顺便说一句,如果您有图像处理工具箱,您的方法似乎是可行的。=)谢谢!如果你在问题中加入免责声明说拟合曲线是正弦曲线,我会给你+1。我认为这是一个应该指出的重要限制out@RopertP.,@Luis Mendo是对的,我的数据并不总是正弦曲线,事实上,最常见的情况是,这些板应该是平的,因为它是聚合物芯片的表面:)感谢您的输入,我也不知道
fit
:)哇,这太棒了!我用k=400试过这个,这是我得到的结果:这当然很好,但你可以看到最后的情节有点下降。你能解释一下吗?好吧,我自己想出来的。我将k因子增加了一点,并添加了
symmetric
作为函数的参数。现在真是太棒了,非常感谢:)很高兴它对你有用!我不知道
'symmetric'
参数
x = linspace(0,3*pi,1000);
y1 = sin(x) + rand()*sin(100*x).*(mod(round(10*x),5)<3);
y2 = 20*(mod(round(5*x),5) == 0).*sin(20*x);
y = y1 + y2;  %// A messy sine-wave
yy = y;       %// Store the messy sine-wave
[~, idx] = sort(y);  
y(idx(1:round(0.15*end))) = y(idx(round(0.15*end)));  %// Flatten out the smallest values
y(idx(round(0.85*end):end)) = y(idx(round(0.85*end)));%// Flatten out the largest values

[foo goodness output] = fit(x.',y.', 'sin1'); %// Do a curve fit
plot(foo,x,y)   %// Plot it
hold on
plot(x,yy,'black')