如何推断一维信号?


25

我有一个长度一定的信号,例如1000个样本。我想将此信号扩展到5000个采样,并以与原始采样率相同的速率采样(即,我想预测如果继续采样较长时间,信号将是什么)。信号由加在一起的几个正弦波分量组成。

我首先想到的方法是获取整个FFT,然后对其进行扩展,但这会在帧1001处留下非常强的不连续性。我还考虑过仅使用峰值附近的频谱部分,尽管这似乎可以在某种程度上改善信号,在我看来似乎并不能保证相位是正确的。扩展此信号的最佳方法是什么?

这是一些MATLAB代码,展示了我想要的理想方法。当然,我不会事先知道确切有3个正弦波分量,也没有确切的相位和频率。我要确保函数是连续的,在移至501点时没有跳跃,

vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal

figure;
plot(output_signal);
hold all;
plot(signal);

基本上,给定绿线,我想找到蓝线。 在此处输入图片说明


3
这是在平铺图像,进行诸如天空扩展的操作或其他操作的上下文中进行的吗?换句话说,除了在边缘“平滑”外,还有其他质量改进措施吗?
datageist

3
您的问题不清楚。“扩展”是什么意思?您是要复制和分类信号副本(平铺),还是要对信号进行5倍的上采样,或者要将其记录5倍以上?您的信号是周期性的吗?我认为有必要提出一个更具体和明确定义的问题,而您要达到的目标的最小示例肯定会有所帮助。
Lorem Ipsum

1
扩展意味着插值吗?问题不是很清楚。
斯里拉姆

从来没有意识到这可能意味着很多事情...将尝试使它更清晰,基本上,我想以相同的速率采样一维信号,但是需要更长的时间。
PearsonArtPhoto,2011年

1
@endolith:这会改善吗?
PearsonArtPhoto 2011年

Answers:


16

根据来源,以下论文中描述的基于DCT的光谱插值方法看起来很有希望:

lk,HG,GülerS. “基于改进的DCT合成的信号变换和插值”,《数字信号处理,出版社,2011年。

这是论文中显示插值示例的图之一:

在此处输入图片说明

该技术在丢失段恢复中的应用(例如4.2。丢失基音周期的合成)可能与外推最为相关。换句话说,抓住一块现有的源材料,假装在边缘和您选择的任意线段之间有丢失的线段,然后“重构”“缺失”部分(并可能丢弃最后使用的线段)。似乎该技术的一个更简单的应用将可以无缝地循环源材料(例如3.1。频谱幅度的内插)。


1
可悲的是链接已死。我只能找到此付费下载
knedlsepp

@knedlsepp 此链接似乎可以使论文没有出现在付费专栏后面。
彼得·克

18

我认为您正在寻找线性预测编码(也称为自回归移动平均值)。LPC通过首先将线性模型拟合到时间序列来推断时间序列,其中每个样本均假定为先前样本的线性组合。将模型拟合到现有的时间序列后,可以继续运行以推断更多的值,同时保持平稳的(?)功率谱。

这是Matlab中的一个小示例,使用该lpc函数估算LPC系数。

N = 150;    % Order of LPC auto-regressive model
P = 500;    % Number of samples in the extrapolated time series
M = 150;    % Point at which to start predicting

t = 1:P;

x = 5*sin(t/3.7+.3)+3*sin(t/1.3+.1)+2*sin(t/34.7+.7); %This is the measured signal

a = lpc(x, N);

y = zeros(1, P);

% fill in the known part of the time series
y(1:M) = x(1:M);

% in reality, you would use `filter` instead of the for-loop
for ii=(M+1):P      
    y(ii) = -sum(a(2:end) .* y((ii-1):-1:(ii-N)));
end

plot(t, x, t, y);
l = line(M*[1 1], get(gca, 'ylim'));
set(l, 'color', [0,0,0]);
legend('actual signal', 'extrapolated signal', 'start of extrapolation');

当然,在实际代码中,您将filter通过使用LPC系数a作为IIR滤波器并将已知的时间序列值预加载到滤波器状态中来实现外推;像这样的东西:

% Run the initial timeseries through the filter to get the filter state 
[~, zf] = filter(-[0 a(2:end)], 1, x(1:M));     

% Now use the filter as an IIR to extrapolate
y((M+1):P) = filter([0 0], -a, zeros(1, P-M), zf); 

这是输出:

LPC示例

尽管预测由于某种原因随时间而消失,但它的工作还是很合理的。

我实际上对AR模型了解不多,也想知道更多信息。

-

编辑:@china和@Emre是正确的,Burg方法似乎比LPC更好。只需将上面的代码更改lpcarburg,即可得到以下结果:

使用Burg方法外推

可以在这里找到代码:https//gist.github.com/2843661


H(z)=b(z)/a(z)

@Emre有没有办法改善推断?
nibot 2012年

正如@chinnu所说,简单的方法是将输出馈送到输入中。
Emre

2
好的,您让我着火了MATLAB:P通过使用其他AR估计算法可以避免此问题;只需替换a=lpc(x,N)a=arburg(x,N)。有关AR算法的(干)讨论,请参见为什么不应该将Yule-Walker用于自回归建模
Emre,2012年

1
显然这有点晚了,但是您的设置存在问题。您提供完整的时间序列的xP测量)到lpc(或arburg)估计模型系数时。对于根据原始问题进行的推断,您实际上应该仅将此估计基于首次M测量。提供较少的时间点会导致推断效果较差,但效果仍然不错。
克里斯·C

6

通过使用BURG方法估算LP系数,一维“外推”非常简单。一旦有了LP系数,就可以通过应用滤波器轻松计算时间采样。Burg预测的样本是您输入时间段的下一次样本。


6

如果您完全确定信号中只有很少的频率成分,则可以尝试使用MUSIC算法来找出信号中包含的频率,然后尝试从那里开始工作。我不完全确定是否可以使其正常工作。

此外,由于您的数据是完全确定性的,因此您可以尝试构建某种非线性预测变量,使用现有数据集对其进行训练,然后对其进行推断

一般来说,这是一个外推问题,您是否想对Google 进行价格的Fourier外推之类的事情?


(几年后)找到一些频率分量的另一种算法是谐波反演
丹尼斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.