如何根据频率校准信号

信息处理 fft 频率响应 IFFT 声学 测量
2022-02-10 02:51:48

我有加速度计的记录(关于频率的非平坦响应),我想将我的电压时间序列转换为加速度值。有这样做的标准方法吗?

我的建议是:

  1. 将信号分成等间距的部分,重叠 50%。
  2. 对每个段应用 fft(带有适当的窗口)并将校准值应用于每个频率。
  3. 通过应用 ifft 并反转窗口变换将片段转换回时间序列。我们没有校准时间序列的片段,尽管它们可能在窗口片段之间不相交。
  4. 将三角形窗口应用于所有重叠段并将它们添加到单个时间序列中。三角形窗口应导致窗口段之间的平滑过渡,从而产生连续的校准时间序列。

这种方法有什么问题吗?窗口选择取决于用例。是否有其他方法可以实现相同的目标?

3个回答

潜在的问题很多。

您真的想对校准曲线表示的数据应用过滤器,这似乎是您的概念方法,只有频域过滤不涉及重叠和窗口,这在频谱估计中会涉及。

困难的部分是将校准曲线转换为过滤器。

我同意@user28715 的回答。最好的方法是将过滤器应用于您的时间序列以获得校准的时间序列。

筛选

您没有指定您使用的是哪种语言,但在 Matlab 中我使用了 designfilt 函数。https://www.mathworks.com/help/signal/ref/designfilt.html

d = designfilt('arbmagfir',...);  
a = 1;   
b = d.Coefficients;  

或者你可以使用
b = fircls(N,f,amp,up,lo);

我不知道如何在 Python 中做到这一点,但可能有一个等价物。

MATLAB

冲动反应

N 是时间序列的长度;M 是你的脉冲响应的长度;

M = 200;
p = zeros(M);
p(1) = 1;
h = filter(b,a,p);

但是我只展示了上面的语法来说明与下面的python方法等效。真的,你只会使用:

h = filter(d,p);

卷积方法

u = conv(x, h);
u = u(0:N);

傅里叶逆变换法

z = ifft(fft([x zeros(1,M-1)], nFFT) .* fft([h zeros(1,N-1), nFFT));

Python

冲动反应

p = np.zeros(200)
p[0] = 1
h = signal.lfilter(b, a, p)

卷积方法

u = signal.convolve(x, h)
u = u[0:N]

傅里叶逆变换法

z = ifft(fft(x, nFFT) * fft(h, nFFT)) 

我正在尝试做同样的事情。我的想法是应用基于灵敏度/频率曲线的数字滤波器,以校准我的信号。你成功地做到了这一点吗?