如何将时间序列转换为不同的频段?

信息处理 傅里叶变换 时间序列
2022-01-30 06:08:39

我有一个以 32 MHz 采样的实时序列。因此,当我对它进行通道化并根据时间绘制它时,我得到一个频率与时间的图像图,其中频域跨越 16 MHz。详细地说,这基本上需要获取 2048 个样本数据块并对每个数据块进行傅里叶变换,以获得 1024 通道“16 MHz”宽的傅里叶变换(因为我们只关心正频率)。它看起来像这样:

频率与时间图

该图中的每条垂直线都是 1024 个通道的傅立叶变换。这意味着相邻垂直线之间的时间步长为 2048 个样本宽或 64 微秒宽。

现在,我想做的是转换这个时间序列,使它看起来像是以 48000 Hz 采样的,但实际上并非如此。基本上,我希望 16 Mhz 频道对应于 24 kHz 频道。所以,我还是想保留数据的结构。所以,一个简单的低通滤波器不起作用,因为我实际上并不想去除更高的频率,我只想将它全部“红移”。我想从一个0 - 16 MHz乐队变成一个0 - 48 kHz乐队。但是那些以 4 Hz 脉冲的脉冲,我仍然希望它们以 4 Hz 脉冲。

我尝试这样做的方法是对频道进行分箱。所以,如果我有 1024 个通道(如上所示)——我会尝试将它们合并为 32 个通道(并将频谱压缩 32 倍)——这基本上意味着我将采用 32 个通道块并将它们相加或以某种方式平均它们以获得一个频道。现在,我真的很想将这个频谱压缩 666 次,但这没关系。我真的只需要了解如何将多个傅里叶变换有意义地组合成一个。

不幸的是,我知道如何做到这一点的唯一方法是获取傅立叶变换的幅度,然后将相邻通道相加以对通道进行分箱。但是这会丢失相位信息——我会丢失我想要生存的脉冲。那么,如何在不丢失相位或幅度信息的情况下将这些通道放入有意义的 bin 中?

更简洁地说,我的问题如下:

给定 N 个实函数的 N 个傅里叶变换,是否有一种有意义的方法可以在不丢失相位和幅度信息的情况下获得它们的总和?

当然,如果有人知道在不合并渠道的情况下处理我的整体问题的更好方法,这不一定是问题。

2个回答

从数学上讲,改变信号的频率非常容易:

在@OlliNiemitalo 的回答之后,0.003 频移可以在

  • 时域,或
  • 频域。

我建议在时域中进行,通过将信号与复杂的正弦曲线相乘,

ej2πfshiftn,n{1,2,}

这样你就可以得到任意的频移。

不过,您需要将幅度相加是不对的——您正在做的可能是相干采样(即,采样时钟不会在每个 2048 个样本块之后停止,而是从下一个随机延迟开始,但连续以稳定的频率运行),因此将多个 FFT 相加而不降低它们的幅度是可行的——这就是 DFT 作为线性运算的美妙之处,并且基本变换的基础是正交的。

可以这样想:

假设你加起来很多 (k) 连续的 FFT。因为 DFT 是线性的,所以它与将许多连续的 2048 个时间样本向量相加是一样的。然后发生的事情是每 2048 个样本重复的东西乘以k,而不会减弱或抵消的事物。这听起来像是一件坏事™,但是,您必须意识到 DFT 可以在每个 bin 中表示的频率的一件事:

2048-FFT 中的每个 bin 代表一个频率,该频率是基频的整数倍(即fsampleNFFT)。所以完美落入每个垃圾箱的东西已经固有地重复NFFT=2048. 因此,这样做通常(假设采样时钟足够稳定!)只需通过以下方式提高您的 SNRk.

最后,只需将时间信号的 2048 个向量相加,然后转换结果。您将获得具有更高 SNR 的 2048-DFT,这绝对是有意义的。

如果我没看错,你想:

  • 将频率缩放 0.003 倍
  • 不缩放时间

在音乐环境中,这被称为音高偏移,因为音符遵循对数频率标度,并且该标度中的加法(偏移)对应于线性频率标度中的乘法。或者,您可以进行保频时间拉伸,然后重新采样。

很好地进行音高转换/时间拉伸是非常困难的,并且没有一种完美的方法可以做到这一点,因为最佳算法取决于您想要保留的时频结构。大多数已知算法并不将其视为纯粹的优化问题,而是使用启发式方法来识别傅里叶变换中的频率,在分析帧中跟踪它们,然后尝试重新合成缩放频率,保留幅度和瞬态相位关系。https://en.wikipedia.org/wiki/Audio_time-scale/pitch_modification中列出了一些算法通过保留整体频谱包络来尝试抵消共振峰频率移动的“花栗鼠效应”是很常见的,但在您的情况下,不需要这样的补救措施。

您可以尝试Rubber Band,其中有可用的可执行和库版本。我发现它可以为一般音频提供不错的结果。0.003 比率非常极端,因此您可能需要将其分解为更小的部分比率。