Matlab 平滑曲线

Matlab 平滑曲线,matlab,plot,Matlab,Plot,下面是我的绘图代码。如何使绘图更平滑 len1 = [25, 250, 500, 750, 1000]; for k1 = 1:length(len1) standard_deviation1(k1) = std(resdphs(1:5000, len1(k1))); end f10 = [110, 100, 90, 80, 70]; figure(3),plot(f10, standard_deviation1);xlabel('frequency'); ylabel('standa

下面是我的绘图代码。如何使绘图更平滑

len1 = [25, 250, 500, 750, 1000];
for k1 = 1:length(len1)
    standard_deviation1(k1) = std(resdphs(1:5000, len1(k1)));
end

f10 = [110, 100, 90, 80, 70];
figure(3),plot(f10, standard_deviation1);xlabel('frequency'); ylabel('standarddev');

网格

如注释中所述,您可以首先尝试对数据应用局部平滑,从而对数据中的重叠窗口应用局部平滑。但是,要使此操作成功,必须具有更高的点密度才能实现良好的平滑效果。目前,您的绘图只有几个点以500个单位均匀分布,因此移动平均线将显著改变绘图的外观。我马上给你举个例子

让我们回到手头的方法。首先,在每个点之间应用线性插值以获得更高的点密度。应用线性插值后,可以使用应用移动平均运算。然而,将会发生的是,在关键点之间将存在不代表您的问题的人工数据。我还想提到的是,该图是出于美学目的,关键点之间的数据不应用于任何关键决策

如果你只想绘制点,不要考虑使用<代码>图并使用它。在任何情况下,都可以用作关键点之间插值的基本方法。一旦你这样做了,你就可以通过卷积应用移动平均——特别是,使用一个内核,它有少量的过滤器抽头,这些抽头的权重都是相等的。类似5点或7点的窗口可能就足够了

使用上面声明的变量:

%// Specify number of total points
num_points = 300;

%// Specify moving average window
move_size = 7;

%// Specify interpolated y coordinates
xpts = linspace(min(f10), max(f10), num_points);
out = interp1(f10, standard_deviation1, xpts, 'linear');

%// Apply moving average
kernel = (1/move_size)*(ones(1,move_size));
out_smooth = conv(out, kernel, 'same');

%// Also apply moving average on the raw data itself for demonstration
out_smooth_raw = conv(standard_deviation1, kernel, 'same');

%// Plot everything
plot(f10, standard_deviation1, f10, out_smooth_raw, 'x-', xpts, out_smooth);
legend('Original Data', 'Smoothed Data - Raw', 'Smoothed Data - Interpolated');
让我们用一些示例数据来实现这一点:

f10 = 0 : 500 : 5000;
rng(123); %// Set seed for reproducibility
standard_deviation1 = rand(1,numel(f10));
使用上述数据和上述代码,我们得到以下曲线图:


如您所见,由于分辨率的原因,对数据应用移动平均而不进行插值会显著改变数据。如果您先应用插值,然后应用移动平均值,您将看到在角点平滑的情况下,原始数据得到了更好的表示。请记住,平滑结果开始和结束时的数据将毫无意义,因为您将采用窗口的移动平均值,并在数据中填充零,以允许计算工作。

如注释中所述,您可以首先尝试对数据应用局部平滑,从而对数据中的重叠窗口应用局部平滑。但是,要使此操作成功,必须具有更高的点密度才能实现良好的平滑效果。目前,您的绘图只有几个点以500个单位均匀分布,因此移动平均线将显著改变绘图的外观。我马上给你举个例子

让我们回到手头的方法。首先,在每个点之间应用线性插值以获得更高的点密度。应用线性插值后,可以使用应用移动平均运算。然而,将会发生的是,在关键点之间将存在不代表您的问题的人工数据。我还想提到的是,该图是出于美学目的,关键点之间的数据不应用于任何关键决策

如果你只想绘制点,不要考虑使用<代码>图并使用它。在任何情况下,都可以用作关键点之间插值的基本方法。一旦你这样做了,你就可以通过卷积应用移动平均——特别是,使用一个内核,它有少量的过滤器抽头,这些抽头的权重都是相等的。类似5点或7点的窗口可能就足够了

使用上面声明的变量:

%// Specify number of total points
num_points = 300;

%// Specify moving average window
move_size = 7;

%// Specify interpolated y coordinates
xpts = linspace(min(f10), max(f10), num_points);
out = interp1(f10, standard_deviation1, xpts, 'linear');

%// Apply moving average
kernel = (1/move_size)*(ones(1,move_size));
out_smooth = conv(out, kernel, 'same');

%// Also apply moving average on the raw data itself for demonstration
out_smooth_raw = conv(standard_deviation1, kernel, 'same');

%// Plot everything
plot(f10, standard_deviation1, f10, out_smooth_raw, 'x-', xpts, out_smooth);
legend('Original Data', 'Smoothed Data - Raw', 'Smoothed Data - Interpolated');
让我们用一些示例数据来实现这一点:

f10 = 0 : 500 : 5000;
rng(123); %// Set seed for reproducibility
standard_deviation1 = rand(1,numel(f10));
使用上述数据和上述代码,我们得到以下曲线图:


如您所见,由于分辨率的原因,对数据应用移动平均而不进行插值会显著改变数据。如果您先应用插值,然后应用移动平均值,您将看到在角点平滑的情况下,原始数据得到了更好的表示。请记住,平滑结果开始和结束时的数据将毫无意义,因为您将采用窗口的移动平均值,并将零填充到数据中,以允许计算工作。

?可能采用移动平均值?我的意思是,如果您观察绘图,它有许多角。所以它应该没有角落。在拐角处应该有平滑的曲线。你的代码和那张图不对应。具体地说,
x
值正在绘制范围为110到70的
f10
,而绘图中的
x
轴范围为0到5000。要使移动平均有效,还必须在每个关键点之间插值。从图上看,似乎每个点的间距为500个单位,因此除非数据密度显著增加,否则移动平均法可能对您没有帮助。?可能采用移动平均法?我的意思是,如果您观察图,它有许多角。所以它应该没有角落。在拐角处应该有平滑的曲线。你的代码和那张图不对应。具体地说,
x
值正在绘制范围为110到70的
f10
,而绘图中的
x
轴范围为0到5000。要使移动平均有效,还必须在每个关键点之间插值。从图中可以看出,每个点的间距为500个单位,因此除非数据密度显著增加,否则移动平均法可能对您没有帮助。您为什么选择移动大小为7?@christylynn002。7似乎是给定数据的最好看的图。我试了很多。选择一个对您最有意义的值,并使您的绘图看起来更漂亮。为什么您选择的
move\u size
为7?@christylynn002。7似乎是给定数据的最好看的图。我试了很多。选择一个对您最有意义的值,并使您的绘图看起来更漂亮。