在嘈杂的数据中找出波的高度和长度

时间:2013-10-16 20:24:59

标签: matlab filtering

我的目标是找到波高和波长的最大值。

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周围的峰值时,我得到了所有的峰值。我如何过滤,所以我只得到“真正的”波峰。解决方案需要是通用的,以便在我更改域大小,波高或波浪周期时它仍然有效。

dwcL02

2 个答案:

答案 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比数组长度短。