C语言版本STFT/ISTFT

接上一篇: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 

语音深度学习群

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李飞刀李寻欢

您的欣赏将是我奋斗路上的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值