我的理解是,如果我的信号中的频率与垃圾箱不完全一致,它会在左右两侧的几个垃圾箱上涂抹。
如何确定瞬时幅度?(我需要担心窗口功能吗?)
我的理解是,如果我的信号中的频率与垃圾箱不完全一致,它会在左右两侧的几个垃圾箱上涂抹。
如何确定瞬时幅度?(我需要担心窗口功能吗?)
首先你需要计算量级:
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)
瞬时频率由解析信号的相位导数给出。解析信号为
其中是希尔伯特变换核。它可以写成
其中和。称为瞬时幅度,称为瞬时相位。然后以弧度为单位的瞬时频率由下式给出
希尔伯特变换具有无限的脉冲响应,因此使用整个信号进行计算。通常,人们会带通信号以定位响应。这既涂抹了空间域中的信号,又去除了直流和高频分量。然后将如上计算的值称为局部幅度、相位和频率。由于希尔伯特变换在傅里叶域中的 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 输出的“箱”。您可以计算诸如群延迟之类的东西,但是要获得变化的频率,您需要有多个帧(按时间间隔)并查看从一帧到下一帧的相位变化(在各种箱中)。