我是靠谱客的博主 端庄鼠标,最近开发中收集的这篇文章主要介绍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 

语音深度学习群

 

 

最后

以上就是端庄鼠标为你收集整理的C语言版本STFT/ISTFT的全部内容,希望文章能够帮你解决C语言版本STFT/ISTFT所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部