微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

STFT的节能

如何解决STFT的节能

正在进行的项目需要一个短时傅立叶变换。为此,我使用 scipy.signal.stft。从理论上,我们了解到时域中的信号与时频域中的信号具有相同的能量; Parseval 定理 (https://en.wikipedia.org/wiki/Parseval%27s_theorem)。但是,当我使用 scipy.signal.stft 时,如果比较两个能量值的计算,我不会获得相同数量的能量。我很确定,这是因为在使用 scipy.signal.stft 时涉及到一些缩放,所以我吐出了源代码。经过一些深入的搜索,我找到了 np.sqrt(1/(sum(win)**2)) 的缩放因子。但是,使用此比例因子不起作用:

示例代码

fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 500*np.cos(2*np.pi*0.25*time)
carrier = amp * np.sin(2*np.pi*3e3*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power),size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise

frame_size = 1000
window = scipy.signal.windows.hann(frame_size,sym=False)
f,t,Zxx = scipy.signal.stft(x,fs,window=window,nperseg=frame_size)
scale = np.sqrt(1/(sum(window)**2))
Zxx_scaled = Zxx/scale

Et=np.sum(x**2)
Ef=np.sum(abs(Zxx_scaled)**2)/N
print("Et = %.3f" % Et)
print( "Ef = %.3f" % Ef)

导致(取决于噪音,但在规模上):

Et = 1641328.607
Ef = 6158.539

有谁知道如何正确缩放生成的 STFT 矩阵值以获得相等的能级并证明 STFT 的能量守恒?

(我正在寻找一个 sum(window)**2 常量变换(和窗口),并且由于窗口用于 STFT 和 I-STFT,如果我使用 hann,我假设我有一个“紧框架”变换window. 然而,证明能量守恒是第一步.....)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。