我有一个长度一定的信号,例如1000个样本。我想将此信号扩展到5000个采样,并以与原始采样率相同的速率进行采样(即,我想预测如果继续采样较长时间,信号将是什么)。信号由几个正弦分量加在一起组成。我也考虑过只使用峰值附近的频谱部分,虽然这似乎在某种程度上改善了信号,但在我看来,并不能保证相位正确。扩展此信号的最佳方法是什么?

下面的一些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);

基本上,给定绿线,我想找到蓝线。


评论

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

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

从来没有意识到这可能意味着很多事情...将尝试使它更清晰,基本上我想以相同的速率对一维信号进行采样,但是需要更长的时间。
@endolith:这样可以改善吗?

#1 楼

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

lk,HG,GülerS。 >改进的DCT综合”,数字信号处理,印刷中的文章,
2011年。


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

评论


$ \ begingroup $
可悲的是链接已死。我只能找到此付费下载。
$ \ endgroup $
–knedlsepp
15年1月6日在10:48

$ \ begingroup $
@knedlsepp此链接似乎可以使论文没有出现在付费专栏后面。
$ \ endgroup $
– Peter K.♦
17年5月25日在11:35

#2 楼

我认为您正在寻找线性预测编码(也称为自回归移动平均值)。 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');


这里是输出:

我实际上对AR模型了解不多,也很想了解更多。

-

编辑:@china和@Emre是正确的,Burg方法似乎比LPC更好。只需将上述代码中的lpc更改为filter,即可得到以下结果: br />

评论


$ \ begingroup $
LPC实际上是AR,没有MA。外推信号“消失”,因为外推器的传递函数$ H(z)= b(z)/ a(z)$引起衰减。
$ \ endgroup $
–埃姆雷
2012年5月18日23:31

$ \ begingroup $
@Emre有没有办法改善推断?
$ \ endgroup $
– nibot
2012年5月21日在7:52

$ \ begingroup $
如@chinnu所说,简单的方法是将输出馈送到输入中。
$ \ endgroup $
–埃姆雷
2012年5月22日下午5:02

$ \ begingroup $
好的,您让我着迷了MATLAB:P通过使用不同的AR估计算法可以避免此问题。只需将a = lpc(x,N)替换为a = arburg(x,N)。有关AR算法的(干式)讨论,请参见为什么不应该将Yule-Walker用于自回归建模
$ \ endgroup $
–埃姆雷
2012年5月25日17:18

$ \ begingroup $
这显然有点晚了,但是您的设置存在问题。在估算模型系数时,可以提供x(P测量)到lpc(或arburg)的完整时间序列。对于原始问题的推断,您实际上应该仅基于前M个测量值进行此估算。提供较少的时间点会导致推断效果较差,但效果仍然不错。
$ \ endgroup $
–克里斯C
16-4-25在19:11



#3 楼

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

#4 楼

如果您完全确定信号中只有很少的频率成分,则可以尝试使用MUSIC算法找出信号中包含的频率,然后尝试从那里开始工作。我不完全确定是否可以使它完美地工作。现有数据集,然后将其推算出其余数据。

评论


$ \ begingroup $
(几年后),找到一些频率分量的另一种算法是谐波反演。
$ \ endgroup $
–丹尼斯
16年1月31日在15:32