我的目标是找到波高和波长的最大值。
dwcL01
虽然dwcL10
是<3001x2 double>
的数组,其数字波模型的输出。
我的部分内容:
%% Plotting results from SWASH
% Examination of phase velocity on deep water with different number of layers
% Wave height 3 meters, wave peroid 8 sec on a depth of 30 meters
clear all; close all; clc;
T=8;
L0=1.56*T^2;
%% Loading results tabels.
load dwcL01.tbl; load dwcL02.tbl; load dwcL03.tbl; load dwcL04.tbl;
load dwcL05.tbl; load dwcL06.tbl; load dwcL07.tbl; load dwcL08.tbl;
load dwcL09.tbl; load dwcL10.tbl;
M(:,:,1) = dwcL01; M(:,:,2) = dwcL02; M(:,:,3) = dwcL03; M(:,:,4) = dwcL04;
M(:,:,5) = dwcL05; M(:,:,6) = dwcL06; M(:,:,7) = dwcL07; M(:,:,8) = dwcL08;
M(:,:,9) = dwcL09; M(:,:,10) = dwcL10;
%% Finding position of wave crest using diff and sign.
for i=1:10
Tp(:,1,i) = diff(sign(diff([M(1,2,i);M(:,2,i)]))) < 0;
Wc(:,:,i) = M(Tp,:,i);
L(:,i) = diff(Wc(:,1,i))
end
如果数据“平滑”,这适用于查找最大值。下图显示了我的数据部分。当我只需要x = 40
周围的峰值时,我得到了所有的峰值。我如何过滤,所以我只得到“真正的”波峰。解决方案需要是通用的,以便在我更改域大小,波高或波浪周期时它仍然有效。
答案 0 :(得分:1)
如果你基本上试图将这条数据曲线拟合成正弦波,你是否考虑过进行傅立叶分析(Matlab中的FFT),然后检查那个基频的大小?频率将告诉您波间距和高度的大小,并且在多个周期内使用时将找到平均值。 有关用法的示例,请参阅Matlab help page 但基本要点是:
y = [...] %vector of wave data points
N=length(y); %Make sure this is an even number
Y = fft(y); %Convert into frequency domain
figure;
plot(y(1:N)); %Plot original wave data
figure;
plot(abs(Y(1:N/2))./N); %Plot only the lower half of frequencies to hide aliasing
答案 1 :(得分:0)
我还有一个可能适合您的解决方案。它涉及使用5点中心差而不是2点有限差分来计算二阶导数。当使用diff
两次时,您连续执行两个一阶导数(有限2点差异),这些导数非常容易受到噪声/振荡的影响。使用高阶近似的优点是相邻点有助于滤除小振荡,这可能适用于您的情况。
让f(:) = squeeze(M(:,2,i))
成为数据点数组,h
是点之间的均匀间距:
%Better approximation of the 2nd derivative using neighboring points:
for j=3:length(f)-2
Tp(j,i) = (-f(j-2) + 16*f(j-1) - 30*f(j) + 16*f(j+1) - f(j+2))/(12*h^2);
end
注意,由于这个二阶导数需要左右两个相邻点,所以循环的范围必须从第3个索引开始,结束2比数组长度短。