为什么我画的频谱图和audacity、audition不一样?

文章目录

  • 系列文章目录

    目录

    文章目录

    前言

    一、问题引入

    二、使用步骤

    三、分析和改进

    总结


前言

我们知道audacity和audition都有频谱分析这个窗口,一般过程肯定是分帧加窗,fft变换然后呈现,

大体这个过程是没问题的,但为什么我画出来的频谱图和它们的不一样?本篇文章就来分析这个


一、问题引入

一个典型的wav(一个底噪)的波形频谱,在audition里面展示如下:

fft频谱分析如下:

注意三个要素,window窗长,选取整个wav数据范围,采用hanning窗

二、使用步骤

根据上面的分析,我们自己写了一个频谱分析的spectrum【AI写的,我哪有那么厉害】

clear all
close all
clc[x,fs] = audioread('4-OK.wav');% 1. 分帧处理(假设信号长度是帧长的整数倍)
N = length(x);
signal = x;
winLen =2048;
numFrames = floor(N/winLen);
frames = reshape(signal(1:numFrames*winLen), winLen, numFrames);% 2. 加Hanning窗
window = hann(winLen);logMagAll = zeros(winLen/2+1, 1);
for i = 1:numFramesframe = frames(:,i) .* window;mag = abs(fft(frame, winLen));logMagAll = logMagAll + 10*log10(mag(1:winLen/2+1).^2 + 1e-16);
endlogMag = logMagAll/numFrames ;% 5. 绘图
freq = (0:winLen/2)/winLen * fs; % 频率轴
figure;
semilogx(freq(2:end), logMag(2:end)); % 对数频率轴,跳过DC
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
title('Power Spectrum (Hanning window)');
grid on;

核心过程就是 分帧,加窗,先求 log对数,然后算完之后求平均

 

频谱形状是对的,但发现底噪和整体幅度有差别

底噪是-60,audition显示底噪是-100多呢,这个地方肯定有问题,但俩形状相似,很可能是增益导致,差了倍数。

倍数差在边度呢?

三、分析和改进

audition的源代码肯定是没有,人商业软件,被adobe买了,别想了。我们可以参考audacity 的, 先看看audacity分析的频谱如何

低频底噪太低,没显示全,但是没关系,鼠标可以放到低频,给出信息,大概-100多dB,那和audition的一样,audacity的源代码可是有的哦,马上参考它的代码;

 经过一系列的分析,我们知道这个函数是画频谱的地方【具体怎么分析得到的的可以参考韦神解五次方程的过程,就是题感!

关键是这个地方

方框部分,有个时域加权,对窗口系数的加权!

能量谱没有什么特殊的,就是普通的fft计算 

回到   SpectrumAnalyst::Calculate 函数,这个地方 by每帧会 直接求和

也就是 应该先 求能量谱的总和,不着急求 log,

​​​​​​

等出每一帧的while循环之后呢

能量谱求 20倍log,幅度谱求10倍log

再乘以scale,scale里面有对每一帧的平均,194行

到这里就明白了,注意要点有两个

1、注意要乘窗口归一化权重 wss

2、注意先求 幅度谱加和,再平均,然后上对数,而不是先对数,再加和平均,经常玩log的都知道,说白了其实一个是算术平均,一个是几何平均

行了,道理都清楚了,代码的事情让deepseek 出!嗷嗷的来吧你就

clear all
close all
clc[x,fs] = audioread('4-OK.wav');% 1. 分帧处理(假设信号长度是帧长的整数倍)
N = length(x);
signal = x;
winLen =2048;
numFrames = floor(N/winLen);
frames = reshape(signal(1:numFrames*winLen), winLen, numFrames);% 2. 加Hanning窗
window = hann(winLen);
wss = sum(window); % 窗谱和
if wss > 0wss = 4.0 / (wss^2); % 窗谱平方和归一化因子
elsewss = 1.0;
end% 3. 计算每帧幅度谱平方和
MagAll = zeros(winLen/2+1, 1);
for i = 1:numFramesframe = frames(:,i) .* window;mag = abs(fft(frame, winLen));MagAll = MagAll + mag(1:winLen/2+1).^2;
end% 4. 计算对数幅度谱
scale = wss / numFrames;
logMag = 10 * log10(MagAll * scale);% 5. 绘图
freq = (0:winLen/2)/winLen * fs; % 频率轴
figure;
semilogx(freq(2:end), logMag(2:end)); % 对数频率轴,跳过DC
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
title('Power Spectrum (Hanning window)');
grid on;

再看频谱图

行了,应该对上了,齐刷的!


总结

1、要会发现问题,别总以为自己的代码最牛逼,实际根本不符合规律,-30dB底噪那么大,可能么?

2、要利用互联网资源,能开源的为毛不用,deepseek自己写也不一定你给正确代码,还得靠自己分析

3、要会用deepseek,巧用ai,不受制于ai,才不会被ai卷死

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

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

相关文章

责任链模式 Go 语言实战

责任链模式(Chain of Responsibility) 责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理它。这个模式的主要目的是解耦请求的发送者和接收者,使得多个对象都有机会处理这个请…

使用开源项目youlai_boot 导入到ecplise 中出现很多错误

我是使用ecplise 导入得youlai_boot 这个项目,但是导入到ecplise 中一直出现报错,然后各种maven clean 和maven install 以及update Maven 都没有效果不知道怎么办才好,怎么样解决这个问题,原来是我本地的环境中没有安装 lombok.…

06_Americanas精益管理项目_数据分析

文章目录 Americanas精益管理项目_数据分析(一)思维方法1、数据分析思维2、零售行业-万能「人货场」分析框架(二)商品分析1、品类销量分析2、销量趋势分析3、帕累托法则分析4、商品TopN分析(三)用户分析(四)场景分析Americanas精益管理项目_数据分析 数据分析与数据开…

ES6从入门到精通:类与继承

ES6 类的基本概念 ES6 引入了基于类的面向对象编程语法,通过 class 关键字定义类。类可以包含构造函数、方法和属性。 class Person {constructor(name) {this.name name;}greet() {console.log(Hello, ${this.name}!);} }const person new Person(Alice); pers…

【经验】新版Chrome中Proxy SwitchyOmega2已实效,改为ZeroOmega

1、问题描述 手欠更新了 Chrome 导致无法“上网”,原因是 Proxy SwitchyOmega2 已实效。 2、解决方法 2.1 下载 新版Chrome中Proxy SwitchyOmega2已实效,改为ZeroOmega; 想方设法去下载 ZeroOmega 的crx包,最新的为&#xff1…

在windows上设置python的环境

安装好了python,再具体说下python语言的相关环境。 #01 关于Python Python 是一个高级别的、边运行边解释的、动态类型的编程语言,以简洁的语法、强大的功能和丰富的资源库而闻名。广泛应用于 Web 开发、数据分析、人工智能、自动化脚本等多个领域。 目前 Python 语言有两…

3D 建模与点云建模:从虚拟构建到实景复刻的数字孪生双引擎

在数字化浪潮席卷全球的当下,3D 建模与点云建模如同数字世界的左膀右臂,一个以抽象化的创意构建虚拟蓝图,一个以高精度的实景数据复刻现实世界。它们不仅深刻重塑了影视娱乐、工业制造、建筑设计等传统领域,更成为数字孪生技术蓬勃…

智能检测原理和架构

大家读完觉得有帮助记得关注和点赞!!! 智能检测系统基于AI和大数据分析技术,通过主动感知、行为建模与实时响应构建动态防御体系。其核心在于将传统规则匹配升级为**多模态威胁认知**,实现对新型攻击(如AI…

2025年6月个人工作生活总结

本文为 2025年6月工作生活总结。 研发编码 某国产操作系统curl下载sftp服务器文件问题记录 场景: 某国产系统curl版本信息: # curl --version curl 7.71.1 (x86_64-koji-linux-gnu) libcurl/7.71.1 OpenSSL/1.1.1f-fips zlib/1.2.11 brotli/1.0.7 li…

Java 导出PDF 1、内容可以插入自定义表格 2、内容插入图片

Java PDF导出工具:自定义表格与图片插入 下面我将实现一个Java PDF导出工具,支持插入自定义表格和图片的功能。这个解决方案使用iText 7库,提供了一个直观的用户界面,可以预览生成的PDF内容。 import javax.swing.*; import jav…

sklearn机器学习概述及API详细使用指南

一、机器学习与sklearn简介 机器学习是人工智能的一个分支,它通过算法让计算机从数据中学习规律,并基于这些规律做出预测或决策。scikit-learn(简称sklearn)是Python中最流行的机器学习库之一,它提供了各种监督学习和…

「日拱一码」015 机器学习常用库——scikit-learn

目录 数据预处理 数据标准化(StandardScaler) 数据归一化(MinMaxScaler) 数据离散化(KBinsDiscretizer) 缺失值处理(SimpleImputer) 特征选择 基于单变量特征选择&#xff08…

网络编程学习路线

C网络编程从零基础到精通的学习路线,每一步都和你的项目实际需求紧密结合,帮助你真正做到“学以致用”。 C网络编程学习路线(结合FileHub项目) 第一阶段:网络编程基础入门 1. 计算机网络基础 理解OSI七层模型、TCP/I…

NLP:文本张量表示方法

本文目录: 一、one-hot编码二、word2vec模型(一)概念1.CBOW(Continuous bag of words)模式2.skipgram模式:3.词向量的检索获取 (二)word2vec的训练和使用1. 获取训练数据2.查看原始数据3.原始数据处理,并查…

高阶数据结构------并查集

并查集 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个集合,然后按照一定的规律将归于同一组的元素集合合并。在此过程中要反复用到查询某一个元素归属于哪一个集合的运算。适合于描述这类问题的抽象…

OWASP Top 10 是什么?

OWASP(Open Web Application Security Project,开放Web应用安全项目)是一个致力于提高软件安全性的国际非营利组织。其发布的 ​OWASP Top 10​ 是最具影响力的Web应用安全风险清单,每3-4年更新一次,帮助开发人员、安全…

如何在IIS上部署net系统(安装iis参考上一篇)

1.对后端项目打包,我使用的时rider 2.打包前端 npm run build 3.在iis上部署 网站-添加网站 4.选择之前打包的后端文件,设置端口 5.安装对应net环境插件:主要是runtime和sdk插件以及dotnet-hosting-2.2.0-win,具体版本看自己项…

Docker可视化管理工具Portainer安装部署

1、安装Portainer 编写docker compose文件,使用docker compose文件完成Portainer的安装,首先需要在服务器上编写的名为portainer.yaml的文件,内容如下: [rootserver ~]# cat portainer.yaml services: portainer: image:…

ai之RAG本地知识库--基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析

目录标题 RAG本地知识库问答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析RAGflow 主要功能: 一、RAGflow 简介1.1 允许用户上传并管理自己的文档(文档类型可以是任意类型)1.2 RAGFlow的4个特色1.2.1 AI 模型的智能文档处理系统1.2.2 …

[面试] 手写题-new

function mynew(Func, ...args) {// 1.创建一个空对象const obj {}// 2.新对象隐式原型指向构造函数的显式原型obj.__proto__ Func.prototype// 3.将构建函数的this指向新对象let result Func.apply(obj, args)// 4.返回objreturn result instanceof Object ? result : obj…