C语言版本STFT/ISTFT

article/2025/10/7 6:40:40

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

语音深度学习群

 

 


http://chatgpt.dhexx.cn/article/mUjeYBcB.shtml

相关文章

stft isar成像 matlab,基于STFT和FRFT的运动目标雷达三维成像方法与流程

本发明属于数字信号处理技术领域,特别涉及一种运动目标雷达三维成像方方法,可 用于对运动目标识别时,雷达ISAR对其三维成像。 背景技术: 逆合成孔径雷达ISAR是一种全天候、全天时的远程探测手段,具有对运动目标进行 成像的能力,被广泛应用于目标跟踪、目标识别、机场监视…

librosa 语音库(二)STFT 的实现

librosa是一个应用广泛的音频处理python库。 在librosa中有一个方法叫做stft,功能是求音频的短时傅里叶变换, librosa.stft 返回是一个矩阵 短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t) 当调用的形式是 np.abs( stft() ),…

python的opencv操作记录(七)——短时傅里叶变换(stft)

文章目录 DCT-傅立叶变换的局限性STFT 短时傅里叶变换从另一个角度来理解图像的“时域”数据看看fs和t这两个参数再看看怎么划分窗口最后看另外两个出参Zxx返回结构 图像的stft DCT-傅立叶变换的局限性 接上一篇DCT的文章,DCT只提取了整个信号域的频率信息&#xf…

傅里叶变换@(stft和istft)

一、窗函数之短时傅里叶变换stft 前提: 傅里叶变换是针对平稳信号的,但是很多实际应用中的信号都是非平稳的,如果要计算其傅里叶变换,需要假设其周期无限长,然后对这个无限长的信号做变换分析。但是这种无限长信号分…

scipy短时傅里叶分析STFT

scipy短时傅里叶分析 基本原理: 为了使STFT能够通过STFT逆变换反变换,信号加窗必须服从“非零重叠加”(NOLA)的约束,输入信号必须具有完整的加窗覆盖即 ( x . s h a p e [ a x i s ] − n p e r s e g ) (x.shape[axis] - nperseg) % (nper…

STFT笔记

因为不懂这个被鄙视了,调包侠来补作业。 基础知识 FFT(fast fourier transfrom)快速傅里叶变换。 推荐阅读《深入浅出的讲解傅里叶变换(真正的通俗易懂)》, 《梅尔频率倒谱系数(MFCC)》。 频谱只获得了频…

利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声

利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声 1、背景 傅里叶变换(TF)对频谱的描绘是“全局性”的,不能反映时间维度局部区域上的特征,人们虽然从傅立叶变换能清楚地看到一整段信号包含的每一个频率的分量值…

STFT(短时傅里叶变换)音频特征提取,用于语音识别 python

在各种音频相关的任务中,不管用什么模型或网络,得到所需的音频特征肯定是必要的一步。下面简单说一下STFT特征 一、原始信号 在说STFT之前,先说一下读入的原始信号,图像是在XY二维上描述的像素点的集合,相应的&#x…

STFT原理及MATLAB代码

原文地址:http://blog.csdn.net/shengzhadon/article/details/46811923 一、先说说STFT的理论 1.概念和特点 STFT(short-time Fourier transform,短时傅里叶变换)是和傅里叶变换相关的一种数学变换,用以确定时变信号其…

nvme分区选mbr还是guid_win7安装系统硬盘模式mbr和guid选哪个?

有很多系统之家的用户,还是喜欢安装win7系统的。但是在新的硬盘里面我们要分区的话,会出现mbr和guid是硬盘分区的两个格式,很多用户在做系统的时候不知道选哪个好,其实最好根据自己的电脑的配置,下面来看看详细的介绍吧…

uefi+guid分区与legacy+mbr分区_硬盘分区表格式GUID和MBR知识普及

我们的电脑硬盘分区格式一共有两种,一种是GUID(GPT),一种是MBR。 啥是硬盘分区呢?举个例子你就明白了,很多人去买电脑的时候,比如你买的电脑只有一块硬盘,店家就会给你分区,把这一块硬盘分成好几个区,比如分成了系统,软件,文档这样三个,那么你打开【我的电脑】后就会…

nvme分区选mbr还是guid_SSD里的特例:NVME固态改MBR格式、装Win7

问题一:NVME固态是否支持MBR文件格式: 场景:前几天朋友兴致冲冲的买了个建兴T10,准备好好体验一下。但是正当他吃着火锅,唱着歌,突然就给麻匪劫了——电脑系统竟然接二连三莫名奇妙的崩溃。 于是朋友就向我求助。由于他的电脑最近除了换了硬盘,并没有添加任何其他的硬设…

guid备份分区表crc错误_硬盘GPT和MBR分区表转换方法

随着硬盘容量越来越大,传统的MBR硬盘分区模式已经不能满足发展需要,预装win8或win10系统的硬盘默认都是GPT分区表(GUID格式),GPT识别2T以上的硬盘以及UEFI启动模式。不过在对系统进行重装时,经常会遇到无法安装在GPT或MBR硬盘中的问题,那么这个时候就需要对硬盘的分区表进…

GUID与MBR

磁盘分区表方案 全局唯一标识分区表是一个实体硬盘的分区表的结构布局的标准。 先说说目前广泛使用的磁盘分区表方案。传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节,这16个字节中…

如何将MBR转为GUID?这方法易于使用且安全!

为什么要将MBR转为GUID(GPT)? MBR代表主引导记录,它使用Legacy BIOS分区表。而GPT磁盘,也就是GUID分区表的缩写,是一种引入了统一可扩展固件接口 (UEFI) 的新布局。GPT磁盘有2个主要优势: GPT磁盘每个分区…

计算机硬盘分区信息,你知道电脑硬盘分区Guid格式和MBR格式有什么区别吗?来看看!...

现在的电脑随着技术的更新,传统的MBR格式虽然支持兼容,但是win10系统基本都使用了GUID分区格式,这样会让整体的系统运作得更有效率。如果还在使用MBR格式的用户想安装系统,没有设置好分区格式,容易导致安装出错&#x…

nvme分区选mbr还是guid_UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别

UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别?很多电脑小白都搞不懂UEFI、GPT、BIOS、MBR到底是什么意思,下面跟随小白系统一起深入了解下UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别吧。 一、了解专业名词 BIOS,全称"Basic Input Output System",中…

nvme分区选mbr还是guid_怎么分辨硬盘是GUID格式还是MBR格式以及怎样更改

首先我们要大概了解一下MBR和GUID是什么 mbr是指主引导记录,guid是指全局唯一标识符(其实我也不太懂这是啥),两者都是硬盘的一种启动模式(大概是这个意思,欢迎指教) 但是mbr只支持2x1024mb,也就是传统意义上的2tb的储存,并且只能分最多4个区,而guid理论上来讲可以有无…

nvme分区选mbr还是guid_系统重装,硬盘分区MBR和GPT选哪个好?看完才知原来有这讲究!...

在重装系统时,不少用户会问老毛桃电脑的硬盘选择MBR格式还是GPT格式好呢?其实,如何选择格式和你用的电脑是BIOS启动或是UEFI启动有很大的联系。我们都知道现在大家较为常用的要么是BIOS+MBR模式,要么是UEFI+GPT模式,选择任意一种模式的分区对系统运行不会造成太大的影响。…

nvme分区选mbr还是guid_重装系统时,磁盘分区MBR和GPT模式哪个好?原来还有这两种区别!...

相信大家在重装系统之前就会将电脑磁盘进行分区,毕竟只有一个分区是不可以进行重装系统的。而且磁盘分区方便管理磁盘,每个分区之间相互独立,数据不容易产生混淆。那么大家在创建磁盘分区的时候,肯定都会遇到MBR和GPT两种引导模式,这时候就会产生人生的思考:究竟应该怎么…