信号关系与转换:如何将一个信号转化为另一个信号?

4

我正在试图将近岸潮汐信号 (点A) 与沿长模型边界的3个点 (点B C D) 相关联。 我希望可能有一个B C D之间的关系,可以将A预测转换为B C和D。目前,我正在进行单一相移、水平以上级别的振幅比例、水平以下级别的振幅比例和平均水平偏移。

这会在高潮和低潮的峰值处产生潮汐信号的折线,并导致模型过度预测落潮流速。我想知道是否有更复杂的关系可用于此类转换?

其中一件事是我想捕捉高水位和低水位之间相位差异 (例如正周期与负周期之比可能对不同点不同)。

当前进程的示例算法。

A = vector (size n x 1 ) units meters

time_A = vector (size n x 1 )

ph_B = phase shift for AvsB.

pos_amp_B = positive amplitude ration.
neg_amp_B = negative amplitude ration.

B_mean = long term mean of B.

A_mean = long term mean of A.

for i = 1:n
    a = A(i) - A_mean
    if a > 0
       B(i) = a*pos_amp_B
    else
       B(i) = a*neg_amp_B
    end
    time_B(i) = time_A(i) = ph_B
    B(i) = B(i) + B_mean
end

顺便提一下:这种关系是基于约6个月的数据得出的。

编辑1: 首先,只需考虑两个正弦信号(即振幅、相移),但不规则,例如周期为12.5小时,但正半周期和负半周期的斜率和周期并不相同。您不需要任何背景知识。我只是在寻找一个转换算法。

编辑2: 这是一个时间序列和fft比较的图片(fft聚焦于高能量频率(12.5小时(半日)),仅为了提供思路,并不是所有频率都如此精细调整)。黑色是A。绿色是零线。

水位[m]时间序列(上)和fft分析(下)


1
你能提供一个关于源信号和目标信号应该类似的信息链接吗?或者可以给出一个你希望关系看起来像什么的示意图吗?或者最理想的情况是,你能用一种不需要领域特定知识的方式来表达你的问题吗? - Andy Jones
这超出了我的知识范畴,但我认为一些测量数据是必要的进行分享。此外,区分正常潮汐值、地震值、海啸值以及其他参数(如空气/水温度和风向/速度/变化)以及测量站的小地图草图和与时间表值的关系(例如北方在哪里)将非常出色。我认为如果没有这些数据,预测是不可能的。另外,测量的水的属性也不同,不同的海洋盐浓度会影响所有... - Spektre
当您将数据(同一类别的数据)进行相关处理时,您才应该看到点之间的关系...因此,在此之后只需确定类别并使用正确的关系方程即可... 不要忘记,如果您仅对一个位置执行此操作...那么它可能适用于其他地方。 - Spektre
首先,想象一下两个正弦信号(即振幅、相位差),但不规则,例如周期为12.5小时,但正半周期和负半周期的斜率和周期并不相同。你不需要任何背景知识,我只是在寻找一个转换算法。 - Alex Byasse
3个回答

2
没有更详细的了解您的领域,很难为您提供明确的答案。在此,我假设您的潮汐行为是一个线性时不变(LTI)系统。从您在问题中展示的数据来看,这似乎是一个合理的假设。
现在,您可以通过对信号A进行幅度和相位调整来创建B、C和D信号。有几种方法可以实现这一点;下面我将通过将A乘以一个复数来完成。调整复数的幅度和相位以获得所需的结果。以下是用Matlab代码编写的示例:
% Create an example signal at location 'A'
t = 0:0.1:10;
A = 0.35.*sin(2.*pi.*0.5.*t) + 1.*sin(2.*pi.*0.5175.*t) + 0.3.*sin(0.5255.*t);

% We want a complex version of A, so let's apply a Hilbert transform to it
A = hilbert(A);

% Now we can create the other signals by transforming the amplitude and
% phase. Exactly what amplitude and phase to apply needs to be determined.
B = 0.9*exp(j*0.1).*A;
C = 0.8*exp(j*0.4).*A;
D = 0.7*exp(j*0.6).*A;

% Plot what these signals look like
figure(1); hold on;
plot(t,real(A),'k');
plot(t,real(B),'r');
plot(t,real(C),'g');
plot(t,real(D),'b');
xlabel('Time');
ylabel('Amplitude');
legend('A','B','C','D');

这将生成一个外观非常类似于您在问题中发布的图片的图。如果您的潮汐行为不能用LTI系统近似,则可能需要进行一些更复杂的非线性建模。

希望能有所帮助!


谢谢你的答复,但是“详细了解我的领域”是什么意思?我已经告诉你这些信号是潮汐信号,并且它们之间的关系不是线性的。上升和下降的水平有不同的斜率,而我的当前算法已经为正数和负数设置了不同的振幅因子。你为什么要使用复数? - Alex Byasse
我认为它只是在复杂形式中进行正弦移位(但我太懒了,没有找方程,所以可能错了)。附言:不要忘记FFT是复杂的,因此您必须应用“对应”于移位的虚部。如果您不想使用复杂域,则必须自己计算移位(查看我的答案,有一种方法可以做到这一点)。 - Spektre

2

潮汐预测模型非常复杂。

为了更精确的预测,您需要更多数据。请查看以下论文(遗憾的是用德语写成;我不知道有英语翻译):

BAW的北海模型用于模拟德国湾的潮汐

幸运的是,这篇论文包含了许多可以在不了解德语的情况下理解的表格和图片。

总之:除了点A、B、C、D的潮位水平外,您肯定需要一些海底地形的近似值,并且您需要风力数据进行计算。仅有六个月的真实数据是不够的:您至少需要一年的数据以覆盖所有季节。

论文第93页引用的软件已于2010年根据GPLv2发布,并可在此处找到。


0

这看起来类似于一个由月球驱动的强迫振荡,对海气系统产生干扰。

你能否建立一个包含四个ODE和外部力源的系统,例如:

   <<< tidal force field >>>

|         |         |         |
o -vvvvv- o -vvvvv- o -vvvvv- o
A         B         C         D

-vvvvv-处,应该像机械弹簧一样。

所有弹簧也会受到月球的影响,如果这些点相距较远,则可能存在一些轻微的相位差移。

您可以使用随机微分方程中给出的一些方法(我希望我知道)来确定系统中的结果矩阵中的常量。随机微分方程的方法似乎在水文学中使用 (需要付费),所以也许我离题不远。

如果您想挑战一下,请尝试使耦合表现出轻微的非线性行为(即,在达到最大值时略微变平,可以被认为是海面上升时增加的表面)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接