抽取块中的长数据

信息处理 抽取
2022-02-01 07:48:44

我有一个非常长的数据,多达 800 万个样本,并希望将其抽取到 1000 个。我正在使用以下 Matlab 代码来执行此操作:

f = numberOfSamples/N; %N is number of points after decimation
p = factor(f); % 
temp = rawData; %with length of numberOfSamples
for i = 1:length(p)
    temp= decimate(temp,p(i),10); %decimate with 10th order iir filter
end

抽取前后的样本数未知,但比率,即抽取数,肯定是一个整数(这是给定的)。换句话说,这些是我程序的输入。如何以块的形式抽取(包括抽取过滤器)数据并获得相同的结果?一个块计算抽取信号的一部分,另一个块计算另一部分,等等。我希望问题很清楚,感谢任何帮助。

1个回答

matlab 中的decimate函数做了两件事。首先,信号被过滤。从您的代码和函数文档页面中,我看到它使用 10 阶 Chebyshev Type I IIR 滤波器,归一化截止频率0.8/p(i)和通带纹波 0.05 dB。接下来,对信号进行下采样。
可以使用创建过滤器

[a_lp,b_lp] = cheby1(10,0.05,0.8/p(i));  

您应该在函数中使用初始条件参数filter以便在块中工作。

现在,下采样有点棘手,因为您必须确保在块之间保持抽取距离。IMO,最简单的方法是使用是抽取因子倍数的块大小。

这是开始的:

N = K*p(i); % K integer
li = 1;
lid = 1;
ri = N;
rid = K;
z = [];
while ri<=numberOfSamples
  [filteredData,z] = filter(a_lp,b_lp,rawData(li:ri,z);
  decimatedData(lid:rid) = filteredData(1:p(i):end);
  li = li + N;
  ri = ri + N;
  lid = lid + K;
  rid = rid + K;
end

(不确定 中的索引decimatedData)。