音频傅里叶变换(基于开源kissffs)

主要参考资料:
深入浅出的讲解傅里叶变换(真正的通俗易懂): https://zhuanlan.zhihu.com/p/19763358
推荐开源项目:KISS FFT: https://blog.csdn.net/gitblog_00031/article/details/138840117
数字硅麦数据的处理(傅里叶FFT):https://blog.csdn.net/shayk/article/details/130305761

目录

  • 概念
    • 傅里叶变换
    • 汉明窗
  • C++代码实现

概念

傅里叶变换

傅里叶变换是一种数学变换,用于将信号从时间域(或空间域)转换到频率域。这种变换揭示了信号的频率成分,是信号处理和系统分析中非常重要的工具。以下是傅里叶变换的一些基本概念:

在这里插入图片描述

汉明窗

汉明窗(Hamming Window)是一种常用的窗函数,主要用于信号处理领域,特别是在傅里叶分析中。它是由理查德·汉明(Richard Hamming)提出的,因此得名汉明窗。

汉明窗的目的是减少信号在进行离散傅里叶变换(DFT)时的频谱泄露现象。频谱泄露是由于信号在时间上被截断而产生的,它会导致频谱分析中的误差。使用窗函数可以对信号的边缘进行平滑处理,从而减少这种误差。

在这里插入图片描述

C++代码实现

//得到频谱
void AudioProcessor::get_spectrogram(int16_t *audio, float *output) {// 初始化一个浮点数mean,用于存储音频样本的平均值。float mean = 0;for (int i = 0; i < audio_length; i++) {mean += audio[i];}mean /= audio_length;// 初始化一个浮点数max,用于存储样本与平均值之差的绝对最大值。float max = 0;for (int i = 0; i < audio_length; i++) {max = std::max(max, fabsf((float)audio[i] - mean));}// 通过步长step_size在音频长度范围内移动,每次提取window_size大小的窗口。// 将当前窗口的样本复制到快速傅里叶变换(FFT)的输入缓冲区fft_input中,并减去平均值mean,然后除以最大值max进行归一化。// 对于FFT输入缓冲区中窗口之外的部分,填充0。for (int i = 0; i < audio_length - window_size; i += step_size) {// Copy the samples into the FFT input buffer.for (int j = 0; j < window_size; j++) {fft_input[j] = ((float)audio[i + j] - mean) / max;}for (int j = window_size; j < fft_size; j++) {fft_input[j] = 0;}// 对每个窗口调用spectrogram_segment函数,并将计算得到的频谱图数据存储到输出数组output中。输出数组的索引由当前窗口的// 位置和池化能量大小pooled_energy_size决定。spectrogram_segment(output + i / step_size * pooled_energy_size);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java蛋糕甜品商城系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

LLama 3的各种微调:拿我司七月的paper-review数据集微调LLama 3

前言 llama 3出来后&#xff0c;为了通过paper-review的数据集微调3&#xff0c;有以下各种方式 不用任何框架 工具 技术&#xff0c;直接微调原生的llama 3&#xff0c;毕竟也有8k长度了 效果不期望有多高&#xff0c;纯作为baseline通过PI&#xff0c;把llama 3的8K长度扩展…

EDU学校漏洞sql注入挖掘记录

某搜索框 biaoti参数单引号报错 双引号正常 经过我的不断测试&#xff0c;’||exp(710)||’报错&#xff0c;exp函数就是执行e的多少次方&#xff0c;709不会报错&#xff0c;710会导致这个数太大报错 709正常,这里说明一下&#xff0c;因为这个数是小数所以返回200&#xff0c…

awk脚本监控

awk脚本监控 使用脚本监控内存&#xff0c;cpu和硬盘的根目录&#xff0c;超过80%提示用户&#xff0c;写成函数库的行&#xff0c;每天早上 的8.50分&#xff0c;执行一次脚本 现在脚本中写需要的内容 cpuu () {aa$(top -b -n 1 |awk NR3 {printf "%.F",$2$4})if …

Spring容器启动流程——refresh()单个方法分析

文章目录 Spring启动过程this()方法refresh()prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory()postProcessBeanFactory()invokeBeanFactoryPostProcessorsregisterBeanPostProcessorsinitMessageSource()initApplicationEventMulticaster()onRefresh()registerLi…

Pycharm利用Anaconda环境

创建环境 conda create --name d2l python3.11 -y 激活环境 conda activate d2l 配置环境 以torch环境为例 我们可以按如下⽅式安装PyTorch的CPU或GPU版本&#xff1a; pip install torch pip install torchvision 我们的下⼀步是安装d2l包&#xff0c;以⽅便调取本书中经…

WPF 数据分组显示

WPF 数据分组显示 效果展示&#xff1a; Student类&#xff1a; public class Student {public string Name { get; set; }public string Class { get; set; }public int Age { get; set; } }MainWindow.xaml.cs public partial class MainWindow : Window {private Observ…

【调试笔记-20240620-Windows- Tauri + Vue 中实现部分区域滚动】

调试笔记-系列文章目录 调试笔记-20240620-Windows- Tauri Vue 中实现部分区域滚动 文章目录 调试笔记-系列文章目录调试笔记-20240620-Windows- Tauri Vue 中实现部分区域滚动 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似…

如何在Java中处理InterruptedException异常?

如何在Java中处理InterruptedException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;多线程是一个常见的应用场景…

专业140+总分400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

专业855信号与系统140&#xff0c;总分400&#xff0c;今年顺利上岸武汉理工大学&#xff0c;总结一下自己的复习经历&#xff0c;希望对报考武理工的同学有所帮助。专业课&#xff1a;855信号与系统 首先教材&#xff1a; 《信号与系统》高等教育出版社 作者&#xff1a;刘泉…

第一百二十三节 Java面向对象的设计 - Java接口继承

Java面向对象的设计 - Java接口继承 接口可以从另一个接口继承。与类不同&#xff0c;接口可以从多个接口继承。 interface Singer {void sing();void setRate(double rate);double getRate(); } interface Writer {void write();void setRate(double rate);double getRate();…

人间烟火气视频素材去哪里找?人间生活气息视频素材网站分享

在数字化时代迅猛发展的今天&#xff0c;短视频已经成为人们表达情感、记录生活的流行方式。无论是在抖音、快手还是B站&#xff0c;一种特别的元素——人间烟火气&#xff0c;为短视频增添了无尽魅力。许多创作者常常困惑&#xff0c;这种生活气息浓厚的视频素材应当如何寻找&…

使用 Swift 6 语言模式构建 Swift 包

文章目录 前言下载 Swift 6 工具链Swiftenv - macOSSwiftly - Linux在 SPM 中启用语言模式命令行包清单文件输出结论前言 我最近了解到,Swift 6 的一些重大变更(如完整的数据隔离和数据竞争安全检查)将成为 Swift 6 语言模式的一部分,该模式将在 Swift 6 编译器中作为可选…

Python 类对象

Python 类对象 经典迭代器 可迭代对象的定义&#xff1a; 使用内置的iter可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法&#xff0c;那么对象就是可迭代的。序列都可以迭代。实现了__getitem__方法&#xff0c;而且接受从0开始的索引&#xff0c;这种对象也…

EfficientNet-V1论文阅读笔记

目录 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks摘要Introduction—简介Compound Model Scaling—混合模型缩放Problem Formulation—范式化问题&#xff08;理论基础&#xff09;Scaling Dimensions—维度缩放Compound Scaling—混合缩放 Eff…

【网络协议】精讲ARP协议工作原理!图解超赞超详细!!!

亲爱的用户&#xff0c;打开微信&#xff0c;搜索公众号&#xff1a;“风云说通信”&#xff0c;即可免费阅读该文章~~ 目录 前言 1. ARP协议介绍 1.1 ARP协议功能 1.2 ARP请求报文 1.3 ARP工作原理 2. ARP 缓存超时 2.1 RARP 3. ARP 攻击 3.1 ARP 攻击分类 前言 首先…

前后端分离后的后端多语言开发:构建统一认证和授权中心

随着前后端分离架构的普及&#xff0c;后端开发逐渐迈向多语言、多平台并存的局面。这种变化带来了灵活性和高效性&#xff0c;但同时也引出了新的挑战&#xff0c;特别是在构建统一认证中心和授权中心方面。本文将探讨如何在前后端分离的架构下&#xff0c;通过合理设计和技术…

中断响应与事件响应

中断响应和事件响应是计算机系统和编程中的两种重要机制&#xff0c;它们用于处理不同情况下的外部或内部发生的事情。尽管它们的目的相似&#xff0c;即对某些特定情况做出反应&#xff0c;但它们在实现、使用场景及设计哲学方面存在一些关键区别。 中断响应 中断响应是指计算…

理解人体手臂七个自由度对应的运动

写本篇的目的在于&#xff0c;我发现很多人理不清人体手臂运动时内收/外展、屈曲/伸展等动作描述的关系&#xff0c;包括我自己也是&#xff01; 我每次要用到的时候都要去查&#xff0c;记不下来&#xff0c;比较麻烦&#xff0c;于是归纳本篇&#xff0c;包含了我本人的理解 …

Hightec编译器系列之高级调试技巧精华总结

Hightec编译器系列之高级调试技巧精华总结 小T为了便于大家理解&#xff0c;本文的思维导图大纲如下&#xff1a; 之前可能很多小伙伴没有使用过Hightec编译器&#xff0c;大家可以参考小T之前的文章《Hightec编译器系列之白嫖就是爽》可以下载一年试用版本。 小T使用过适配英…