为什么将汉明窗口应用于框架数据显示 python 和 C 之间的行为一致差异?

问题描述 投票:0回答:0

这是我用 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];
    }
}

(条件)

  • 采样率:16000
  • 示例 .wav 文件长 1 秒
  • 结果显示读取的数据和分帧的数据没有区别(单独检查)
  • C中的数据通过二进制文件传递给python,在C中保存,在python中读取

(问题) python 窗口函数和 C 窗口函数显示出非常微小的差异,在 +4e-7 ~ -4e07 之间波动。

然而,窗口化数据在 400 帧中的第 180 ~ 220 帧左右显示出相当一致的 abs(差异)0.99~1.0。那是在框架的死点附近。我不明白这是怎么发生的,因为帧的幅度值从个位数到数百不等。幅度差异波动很大,但应用窗函数后中心值的差异是一致的。怎么样??

有人可以给我解释一下这是怎么发生的,或者他们可能有什么想法吗?

python c signal-processing wav mfcc
© www.soinside.com 2019 - 2024. All rights reserved.