====== Adapted Wavelets used to perform pattern detection in PTM produced signal of instantaneous frequency fluctuation ====== \\ Four pattern wavelets are currently available. F1 - taken from the original shoaling breaker (not shown), F2, F3 and F4 with linear rise and then exponential decay (see Figure below: black, red, magenta).\\ The files are included. \\ {{ :patterns.png?600 |}} \\ ===== Version 2 ===== This version was prepared to process the data before WISE2018. [[https://tsail.cv.technion.ac.il:5006//Software/PTMBreakingDetection/V2.ZIP| The files are here]], folder V2. The code is somewhat "messi" and contains several scripts written to process different types of data, namely\\ 1. Linear focusing breaking waves.\\ //wave_analysis_NoVideo_ONEWG.m// 2. Mechanical swell + wind\\ //wave_analysis_NoVideo_ONEWG.m// and //CountBreakersWWandMW_v1.mat// \\ 3. Wind generated waves at several fetches\\ //CountBreakersperFetch.m// \\ \\ Some codes will load the video and some not. Read the code.\\ ===== Version 3 ===== Clean version created on May 3rd, 2018. [[https://tsail.cv.technion.ac.il:5006//Software/PTMBreakingDetection/V3.ZIP| All routines were]] rewritten into several dedicated functions, all are documented inside the functions. The functions were written to treat one signal at a time. Looping on numerous files or wave gauges has to be performed outside the functions. \\ The functions are:\\ 1. //FreqVarHilbertClean.m// - Calculates the F(t) from eta. \\ 2. //LowPass.m// - Low Pass filtering. \\ 3. //SigCondit.m// - Signal (F(t)) conditioning/enhancement, such as amplification, zeroing at times of negative eta, lowpass filtering. \\ 4. //VideoFramesColl.m// - Identifying video frames and numbering in sync with time vector. \\ 5. //ZeroCross.m// - Detecting zero crossings in eta, for detection of crests. \\ 6. //PatternRecWavelet.m// - Loads pattern wavelet and performs adapted wavelet transform. The result is relative energy, higher with waves resembling the pattern. \\ 7. //DetectBreaksLoc.m// - Works with wavelet transform results from 6. and counts the breakers detected, also returns % of breakers detected and their times.\\ \\ An example code processing one WG file from a selected file with or without accompanying video is named //Example_Detect_One_File.m//, the code is also given below.\\ %% Example breaking detection on one WG record with video % V3 version %% Clean clear all; close all; clc; %% Basic settings: Fs=1600; % sampling frequency FN='F1.mat'; % Wavelet to use, by name DetPRCT=0.7; % % of max energy threshold for detection WGc=1; % Collumn number of WG data Vc=6; % column number of video sync data, 0 if no video Fc=0; % Low Pass cutoff frequency, 0 if not needed Noct=64; % N. of octaves for wavelets (resolution) %% Load files, filenames etc.: [Filedat,pathdat] = uigetfile('*.dat','Select the data file file'); data=load([pathdat, Filedat]); [n,m]=size(data); if m>n; data=data'; end; eta=data(:,WGc)-mean(data(:,WGc)); if Vc Vsync=data(:,Vc); [vid_file,path] = uigetfile('*.avi','Select the video file',pathdat); end %% Pefrom basic calculations: % Obtain F(s) by Hilbert transform: [t,frr]=FreqVarHilbertClean(eta, Fs); % Condition the signal (filter amplification crests detection) [fr, tmax, maxe]=SigCondit(eta, frr, Fs, Fc); % Video file frames count if Vc is given non zero if Vc [time_frame_break]=VideoFramesColl(eta, Fs, path, vid_file, tmax, Vsync); end %% Plots: if Vc; pn=3; else; pn=2; end; figure(1); a1=subplot(pn,1,1);% plot eta and peaks plot(t,eta,'-b'); grid on; hold on; scatter(tmax,maxe,20,'ro','filled'); xlabel('t[sec]');ylabel('eta[mm]'); legend('eta','crests'); a2=subplot(pn,1,2);% plot frequency and filtered frequency plot(t,frr,'k');hold on;plot(t,fr,'r'); grid on % ylim([-100 100]); xlabel('t[sec]');ylabel('f(t)[rad/sec]'); legend('fr-without low pass filter','fr-low pass filter and amp'); hold off; if Vc a3=subplot(pn,1,3);% plot frequncy plot(t,frr,'k');hold on;plot(t,fr,'r'); grid on a3.XTick=(time_frame_break(:,1)); a3.XTickLabel=({time_frame_break(:,2)}); xlabel('frame[#]');ylabel('f(t)[rad/sec]'); legend('fr-without low pass filter','fr-low pass filter and amp'); hold off; linkaxes([a1,a2,a3],'x'); else linkaxes([a1,a2],'x'); end %% Now Wavelets to detect the patterns: % Wavelets: [C, fsc]=PatternRecWavelet(fr, Fs, FN, Noct); % Detect [Ndet, Ndetprct, Is, Cc]=DetectBreaksLoc(C, DetPRCT, Fs, tmax); %% Plot again, this time detected breakers positions, coefs maps, etc. figure(2) a21=subplot(3,1,1);% plot eta and peaks plot(t,eta,'-b'); grid on; hold on; scatter(tmax,maxe,20,'ro','filled'); plot(t(round(Is)),zeros(length(Is),1),'kx','MarkerSize',10,'LineWidth',1); xlabel('t[sec]');ylabel('eta[mm]'); legend('eta','crests', 'breakers'); a22=subplot(3,1,2);% plot frequency and filtered frequency plot(t,fr,'k'); grid on if Vc a22.XTick=(time_frame_break(:,1)); a22.XTickLabel=({time_frame_break(:,2)}); xlabel('frame[#]');ylabel('f(t)[rad/sec]'); else xlabel('t[sec]');ylabel('f(t)[rad/sec]'); end legend('fr-low pass filter and amp'); hold off; a23=subplot(3,1,3);% plot frequncy imagesc(t,fsc,abs(C)); colorbar; linkaxes([a21,a22,a23],'x'); ===== Version 4 ===== Small but significant change from Version 3: addition of low pass filtering the Wavelets analysis results down to twice fp, fp being the waves dominant frequency.\\ //LowPass2D.m// - low pass filter the wavelets coefficients matrix. Cuttoff frequency of 2xfp gives good results.\\ [[https://tsail.cv.technion.ac.il:5006//Software/PTMBreakingDetection/V4.ZIP| The files are here]]\\ Example usage code is below:\\ %% Example breaking detection on one WG record with video % V4 version %% Clean clear all; close all; clc; %% Basic settings: Fs=1600; % sampling frequency FN='F3.mat'; % Wavelet to use, by name DetPRCT=0.8; % % of max energy threshold for detection WGc=1; % Collumn number of WG data Vc=0; % column number of video sync data, 0 if no video Fc=30; % Low Pass cutoff frequency, 0 if not needed fc=5; % Low Pass cutoff frequency for Coeffs Noct=64; % N. of octaves for wavelets (resolution) %% Load files, filenames etc.: [Filedat,pathdat] = uigetfile('*.dat','Select the data file file'); data=load([pathdat, Filedat]); [n,m]=size(data); if m>n; data=data'; end; eta=data(:,WGc)-mean(data(:,WGc)); if Vc Vsync=data(:,Vc); [vid_file,path] = uigetfile('*.avi','Select the video file',pathdat); end clear data; %% Pefrom basic calculations: % Obtain F(s) by Hilbert transform: [t,frr]=FreqVarHilbertClean(eta, Fs); % Condition the signal (filter amplification crests detection) [fr, tmax, maxe]=SigCondit(eta, frr, Fs, Fc); % Video file frames count if Vc is given non zero if Vc [time_frame_break]=VideoFramesColl(eta, Fs, path, vid_file, tmax, Vsync); end %% Plots: if Vc; pn=3; else; pn=2; end; figure(1); a1=subplot(pn,1,1);% plot eta and peaks plot(t,eta,'-b'); grid on; hold on; scatter(tmax,maxe,20,'ro','filled'); xlabel('t[sec]');ylabel('eta[mm]'); legend('eta','crests'); a2=subplot(pn,1,2);% plot frequency and filtered frequency plot(t,frr,'k');hold on;plot(t,fr,'r'); grid on % ylim([-100 100]); xlabel('t[sec]');ylabel('f(t)[rad/sec]'); legend('fr-without low pass filter','fr-low pass filter and amp'); hold off; if Vc a3=subplot(pn,1,3);% plot frequncy plot(t,frr,'k');hold on;plot(t,fr,'r'); grid on a3.XTick=(time_frame_break(:,1)); a3.XTickLabel=({time_frame_break(:,2)}); xlabel('frame[#]');ylabel('f(t)[rad/sec]'); legend('fr-without low pass filter','fr-low pass filter and amp'); hold off; linkaxes([a1,a2,a3],'x'); else linkaxes([a1,a2],'x'); end %% Now Wavelets to detect the patterns: % Wavelets: [C, fsc]=PatternRecWavelet(fr, Fs, FN, Noct); % Low pass Filter C Csl=LowPass2D(C,Fs,fc); % Detect [Ndet, Ndetprct, Is, Cc]=DetectBreaksLoc(Csl, DetPRCT, Fs, tmax); %% Plot again, this time detected breakers positions, coefs maps, etc. figure(2) a21=subplot(3,1,1);% plot eta and peaks plot(t,eta,'-b'); grid on; hold on; scatter(tmax,maxe,20,'ro','filled'); plot(t(round(Is)),zeros(length(Is),1),'kx','MarkerSize',10,'LineWidth',1); xlabel('t[sec]');ylabel('eta[mm]'); legend('eta','crests', 'breakers'); a22=subplot(3,1,2);% plot frequency and filtered frequency plot(t,fr,'k'); grid on if Vc a22.XTick=(time_frame_break(:,1)); a22.XTickLabel=({time_frame_break(:,2)}); xlabel('frame[#]');ylabel('f(t)[rad/sec]'); else xlabel('t[sec]');ylabel('f(t)[rad/sec]'); end legend('fr-low pass filter and amp'); hold off; a23=subplot(3,1,3);% plot frequncy imagesc(t,fsc,Csl); linkaxes([a21,a22,a23],'x'); Example result, linear focusing breaking.\\ {{ :focusresult.jpg?600 |}}