如何重新取样/重新组合频谱?

时间:2011-07-12 19:54:45

标签: math matlab pdf fft spectrum

在Matlab中,我经常使用Welch的方法(pwelch)计算功率谱,然后我将其显示在对数 - 对数图上。由pwelch估计的频率是等间隔的,但对数间隔的点对于对数 - 对数图更合适。特别是,当将绘图保存为PDF文件时,由于高频率点过多,这会导致文件太大。

从线性间隔频率到对数间隔频率重新采样(重新绑定)频谱的有效方案是什么?或者,什么是在PDF文件中包含高分辨率光谱而不生成的方法文件大小过大?

显而易见的事情就是简单地使用interp1

  rate = 16384; %# sample rate (samples/sec)  
  nfft = 16384; %# number of points in the fft

  [Pxx, f] =  pwelch(detrend(data), hanning(nfft), nfft/2, nfft, rate);

  f2 = logspace(log10(f(2)), log10(f(end)), 300);
  Pxx2 = interp1(f, Pxx, f2);

  loglog(f2, sqrt(Pxx2)); 

然而,这是不合需要的,因为它不能节省光谱中的功率。例如,如果两个新频率仓之间存在较大的谱线,则只会将其从生成的对数采样频谱中排除。

要解决此问题,我们可以插入功率谱的积分

  df = f(2) - f(1);
  intPxx = cumsum(Pxx) * df;                     % integrate
  intPxx2 = interp1(f, intPxx, f2);              % interpolate
  Pxx2 = diff([0 intPxx2]) ./ diff([0 F]);       % difference

这很可爱并且大部分都有效,但是箱子中心不是很正确,并且它不会智能地处理低频区域,频率网格可能会变得更精细。

其他想法:

  • 编写一个确定新频率分级的函数,然后使用accumarray进行重组。
  • 在进行插值之前,将平滑滤波器应用于光谱。问题:平滑内核大小必须适应所需的对数平滑。
  • pwelch函数接受频率向量参数f,在这种情况下,它使用Goetzel算法计算所需频率的PSD。也许只是首先使用对数间隔的频率向量调用pwelch就足够了。 (这或多或少有效吗?)
  • 对于PDF文件大小的问题:包括光谱的位图图像(看起来像kludgy - 我想要漂亮的矢量图形!);
  • 或者可能显示区域(多边形/置信区间),而不仅仅是分段线来指示光谱。

3 个答案:

答案 0 :(得分:2)

我会让它为我做的工作,并从一开始就给它频率。 doc指出您指定的频率将四舍五入到最近的DFT bin。这应该不是问题,因为您使用结果绘图。如果您担心运行时,我会尝试并计时。

如果你想自己重新修改它,我认为你最好只编写自己的功能来对每个新垃圾箱进行整合。如果你想让生活更轻松,你可以做他们做的事情,并确保你的日志箱与你的线性箱共享边界。

答案 1 :(得分:0)

找到解决方案:https://dsp.stackexchange.com/a/2098/64

简而言之,该问题的一个解决方案是使用频率相关的变换长度来执行Welch的方法。上面的链接是一个包含纸质引文和示例实现的dsp.SE答案。这种技术的一个缺点是你不能使用FFT,但由于计算的DFT点的数量大大减少,这不是一个严重的问题。

答案 2 :(得分:0)

如果要以可变速率(对数)重新采样FFT,则平滑或低通滤波器内核也需要是可变宽度以避免混叠(丢失采样点)。只需为每个绘图点使用不同宽度的Sync插值内核(同步宽度大约是本地采样率的倒数)。