这是我用 python 编写的代码,它从 .wav 文件中提取数据,应用预加重,以 0.010 步幅分成 0.025 毫秒的帧,并应用汉明窗口:
import scipy.io.wavfile as wavfile
import numpy as np
samplerate, data = wavfile.read(filename)
window = np.hamming(int(winlen*samplerate))
# Pre-Emphasis
for i in range(1, len(data)):
data[i] = data[i] - 0.97 * data[i-1]
# Framing
dlen = int((len(data)/samplerate - winlen)/stride)+1
for i in range(dlen):
stpt = int(samplerate*stride)*i
datalen = int(winlen*samplerate)
framedata = data[stpt:stpt+datalen].copy()
frames.append(framedata)
# Apply Window
for i in range(len(frames)):
for j in range(int(winlen*samplerate)):
frames[i][j] *= window[j]
非常标准,我这里没有错。
这是我用 C 编写的代码,用于执行完全相同的操作。
#include <iostream>
#include <cmath>
double *hammingwindow;
hammingwindow = (double*)calloc(framelen, sizeof(double));
short *data = new short[10000000];
double **data_frames;
double **data_frames = Declare2DArray(parameters.numframes, parameters.framelen);
// declare hamming window
for (int i=0; i<framelen; i++) {
hammingwindow[i] = double(0.54) - double(0.46) * cos(2 * PI * double(i) / double(framelen - 1));
}
// apply pre-emphasis (both C and python set to 0.97)
for (int i=1; i<parameters.datasize; i++) {
data[i] = data[i] - parameters.preemphasis * data[i-1];
}
// Divide into frames
int startpoint = parameters.stride * parameters.samplefreq;
for (int i=0; i<parameters.numframes; i++) {
for (int j=0; j<parameters.framelen; j++) {
data_frames[i][j] = data[startpoint*i + j];
}
}
// Multiply hamming window to frames
for (int i=0; i<parameters.numframes; i++) {
for (int j=0; j<parameters.framelen; j++) {
data_frames[i][j] *= parameters.hammingwindow[j];
}
}
(条件)
(问题) python 窗口函数和 C 窗口函数显示出非常微小的差异,在 +4e-7 ~ -4e07 之间波动。
然而,窗口化数据在 400 帧中的第 180 ~ 220 帧左右显示出相当一致的 abs(差异)0.99~1.0。那是在框架的死点附近。我不明白这是怎么发生的,因为帧的幅度值从个位数到数百不等。幅度差异波动很大,但应用窗函数后中心值的差异是一致的。怎么样??
有人可以给我解释一下这是怎么发生的,或者他们可能有什么想法吗?