概述
接上一篇:https://blog.csdn.net/SPESEG/article/details/101672559
注意:寡人的stft是有前提条件的,并不是完全与librosa.stft一一对应【我的版本参数是固定的,不可变,其他是一样的】,因为我的hop_length是固定为nfft的1/4,而nfft与波形长度完全相同,有人说,你这nfft长度和波形长度一样还有短时谱?SB,你先看看librosa中的定义再BB,别特么啥都不了解就凭主观臆断或者以往认知下结论。
我先去吃个饭再说。头文件如下:
float *get_hanning(int n);
float *np_pad(float *y, int n_fft);
float **util_frame(float *y2, int n_fft);
float get_angle(float imag, float real);
cmplx *rfft(float *rin, int n_fft);
void reverse(float *x,int n_fft);
float *irfft(cmplx *mp, int n_fft);
cmplx **stft(float *y, int n_fft);
float *win_sums(float *ifft_window, int n_frames, int n_fft, int hop_length);
float *istft(cmplx **spec, int n_fft);
昨天写的函数测试结果有问题,我挨个测试下。因为cpp中有了complex类型(应该有),我定义同样的结构体结果告诉我重定义,不同基类型,结果我定义成cmplx,另外我将mag和angle的结构用同样的东西了。两者混用。
STFT有问题。待我解决。
python的结果如下:1~16作为输入信号验证
array([ 0.0000000e+00, 3.1415927e+00, -3.1415927e+00, 5.4828723e-16,
3.1415927e+00, 1.2280696e-15, -3.1415927e+00, 6.4078058e-16,
3.1415927e+00], dtype=float32)
array([ 0. , 2.5029557 , -1.630843 , -2.200605 , 3.040559 ,
1.3331858 , -0.31469315, -1.689683 , 3.1415927 ], dtype=float32)
array([ 0. , 2.7401707, -1.5707964, -1.5707964, -1.5707964,
-1.5707964, -1.5707964, -1.5707964, 0. ], dtype=float32)
array([ 0. , 2.9132805 , -1.2707483 , -0.16391452, 1.7701185 ,
-2.435899 , -0.6977143 , 1.1905247 , 3.1415927 ], dtype=float32)
array([ 0. , -3.0581887, 0.4727274, -1.9634954, 1.4135916,
-1.1780972, 2.2885025, -0.3926991, 3.1415927], dtype=float32)
下面的C的结果,只有第一行的第三个数相差个符号,这让我懵逼啊。。。。。。。要是这个位置都出现,那就是有问题
我特么服了,当波形为1~32时,结果仍旧是第一行有问题,不只一个地方。
array([ 0.0000000e+00, -3.1415927e+00, -3.1415927e+00, 3.3679136e-16,
3.1415927e+00, 2.9604969e-16, -3.1415927e+00, 6.0319980e-16,
-3.1415927e+00, 6.3023799e-16, 3.1415927e+00, -3.1086539e-15,
-3.1415927e+00, -1.2200039e-15, 3.1415927e+00, -2.8588476e-15,
3.1415927e+00], dtype=float32)
烦死了,从头开始测试函数。幅度谱都没毛病,就是角度有问题。这个暂时没有发现哪里错误,烦恼。
后面发现了java在new时可能已经初始化为0了,而C中的malloc是没有初始化的,只是分配了空间。
所以如果要在堆中开辟空间必须手动初始化为0,所以这是C中普遍存在的问题,先解决这个。改了这个错误后竟然可以跑的通STFT与ISTFT了,不得不说C还是6,同样1024点,C只需3ms,java30ms,这差别真大。
冻死了,空调开得太冷了,我回去穿个衣服,就住附近。
另外有相关问题可以加入QQ群讨论,不设微信群
QQ群:868373192
语音深度学习群
最后
以上就是端庄鼠标为你收集整理的C语言版本STFT/ISTFT的全部内容,希望文章能够帮你解决C语言版本STFT/ISTFT所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复