如何从 FFT 获得瞬时频率的瞬时幅度?

信息处理 fft 频谱 信号分析 频域
2022-02-23 07:13:52

我的理解是,如果我的信号中的频率与垃圾箱不完全一致,它会在左右两侧的几个垃圾箱上涂抹。

如何确定瞬时幅度?(我需要担心窗口功能吗?)

3个回答

首先你需要计算量级:

windowed = framed .* hann(length(framed))
Fourier = fft(windowed)
Mag = abs(Fourier)

而且您需要基于您的窗口函数构建一个窗口内核!

对于 Hann Window,内核可以是:


   Wk(k) = 0.5 * (sinc(k*(M/N)) / (1 - (k*(M/N))^2))

M=Window Size 
N=FFT Size

当然,您可以对 N 和 M 使用相同的尺寸!

k = Bin Number from FFT / N
sinc = Normalized Sinc, visit http://en.wikipedia.org/wiki/Sinc_function

如果您已经确定了瞬时频率,则需要找到每个频率的相应偏移量,并且当您将 FFT 的幅度乘以 Hann Window Kernel 索引时找到瞬时幅度:

 Offset = abs(InstFreqs(i) / (Fs/N) - i)
 index = floor(abs(Offset) * N) + 1
 InstMag = Mag(i) * Wk(index)

瞬时频率由解析信号的相位导数给出。解析信号为

fA(x)=f(x)+i(hf)(x)

其中是希尔伯特变换核。它可以写成h(x)

fA(x)=A(x)eiϕ(x)

其中称为瞬时幅度,称为瞬时相位。然后以弧度为单位的瞬时频率由下式给出A(x)=|fA(x)|ϕ(x)=arg(fA(x))A(x)ϕ(x)

ω(x)=ddxϕ(x)

希尔伯特变换具有无限的脉冲响应,因此使用整个信号进行计算。通常,人们会带通信号以定位响应。这既涂抹了空间域中的信号,又去除了直流和高频分量。然后将如上计算的值称为局部幅度、相位和频率。由于希尔伯特变换在傅里叶域中的 DC 处具有不连续性,因此最好先将其移除。

在 MATLAB 中获取解析信号是

f_A = hilbert(f);
A = abs(f_A);
phase = angle(f_A);

但现在棘手的一点是,如何区分相位?这在这里讨论:

http://www.mathworks.com.au/matlabcentral/newsreader/view_thread/54129

我会尝试取一段以感兴趣点为中心的相位信号,拟合多项式,然后根据多项式系数计算导数。

你这样做是为了相位声码器还是什么?你在做多帧的短时傅里叶变换(STFT)吗?

我无法将“瞬时频率”(您从计算分析信号中获得)连接到 FFT 输出的“箱”。您可以计算诸如群延迟之类的东西,但是要获得变化的频率,您需要有多个帧(按时间间隔)并查看从一帧到下一帧的相位变化(在各种箱中)。