音频处理
文章平均质量分 92
芥末的无奈
这个作者很懒,什么都没留下…
展开
-
用 NEON 实现高效的 FIR 滤波器
本文多数内容翻译自 Efficient FIR Filter Implementation with SIMD。原文在 SIMD 代码实现中使用到了 AVX,本文将使用 NEON 实现,关于 NEON 如何使用,请参考 Neon intrinsics 简明教程。如何让你的 FIR 滤波器在时域中更快的运行?FIR 滤波器是数字信号处理中的基石。它在将混响应用于音频信号时尤其重要,例如在虚拟现实音频或数字音频工作站的VST插件中。它还被广泛用于移动电话(甚至是前智能手机!)和嵌入式设备的声音应用。如何让 FI原创 2022-12-04 21:23:58 · 676 阅读 · 0 评论 -
【音频处理】Loudness Normalization 响度均衡算法简介
关于响度的概念,以及响度标准化 EBU R.128 的讨论,网上已经有很多优秀的博客了,我就不再赘述了。音频 响度标准化 EBU R.128关于响度的拾遗看完这些介绍,你对响度或多或少已经有了些概念,它是对声音强度的一种描述,它是一种「主观」的心理量,影响因素包括很多,例如信号持续时长、频率特征、声场特性等等。为了测量出音频的响度,有很多组织提出了不同的标准,今天我们要介绍的是由 EBU(European Broadcasting Union,欧洲广播联盟)提出的 EBU-R128 标准。原创 2022-12-02 22:36:47 · 5271 阅读 · 0 评论 -
【音频处理】Fast Convolution 快速卷积算法简介
这篇文章中我们介绍了卷积在信号系统中的重要意义,卷积算法复杂度为 O(N^2),为了加速卷积计算,人们提出了快速卷积算法,本文介绍了 FFT 卷积,Overlap-Add 和 Overlap-Save 块卷积,以及均匀分割卷积算法。算法的相关实现都在,包括 python 版本和 C++ 版本。......原创 2022-08-18 07:37:17 · 5642 阅读 · 0 评论 -
【音效处理】Vibrato 简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现【音效处理】Delay/Echo 简介文章目录系列文章目录一、Vibrato 是什么二、Vibrato 原理2.1 Time-varying delay line2.2 多普勒效应三、Vibrato C/C++ 实现3.1 从 LFO 中得到延迟3.2 算法参数3.3 C/C++ 实现四、总结五、参考一、Vibrato 是什么“vibrato” 一词指的是,在一个音的音高上小的、准周期原创 2022-04-10 09:46:56 · 2091 阅读 · 1 评论 -
【音效处理】Delay/Echo 简介
系列文章目录Delay Line 简介及其 C/C++ 实现LFO 低频振荡器简介及其 C/C++ 实现文章目录系列文章目录一、Delay 是什么二、Delay 原理2.1 Basic Delay三、总结参考一、Delay 是什么Delay(延迟)是一种信号处理技术,它将输入信号纪录气力啊,然后过一段时间再播放。当延迟信号与当前信号混合时,会产生类似回声(Echo)的效果。大多数人都有过在大山中大喊的经历,声音在山谷之间传递,回声余音袅袅。没错,所谓的 Echo 就是这种感觉。看下面两个对原创 2022-04-02 20:53:20 · 5327 阅读 · 0 评论 -
LFO 低频振荡器简介及其 C/C++ 实现
文章目录前言LFO 算法LFO 基本实现向其他波形变换总结参考前言LFO 即 “Low Frequency Oscillator” 低频振荡器,它可以按照各类波形(例如锯齿波、三角波、Sine 波等)进行震动。名副其实,LFO 的振荡频率通常都低于 20HZ,低于人类听觉范围。那么,为什么我们想要一个听不到的振荡器?在音效处理中,我们使用 LFO 来控制音效算法中的某些参数,为听到的声音赋予生命和动感,例如 Vibrator、Flanger 和 Chorus 等。LFO 算法LFO 基本实现L原创 2022-03-30 11:11:15 · 2236 阅读 · 0 评论 -
Delay Line 简介及其 C/C++ 实现
文章目录Delay Line 简介Delay Line 使用Delay Line C/C++ 实现符合直觉的实现优化后的实现总结参考Delay Line 简介在音频处理中,Delay Line 是基础功能组件,用于模拟声学音频传播延迟。它是延迟音效(包括 Delay、Vibrator、Phaser等)和音频 Synthesizer 中基本组成部分。Delay Line 的功能是在输入信号和输出信号之间引入一个时间延迟。此外,有时候我们要对齐两路信号,其中一路有延迟,这时候也可以使用 Delay L原创 2022-03-30 11:11:34 · 1513 阅读 · 1 评论 -
实时音频编程(一)
简介初入音频坑时,对于"实时音频编程"并无基本认识,也从未意识到音频编程在某些场景下是”较为特殊的“,只是觉得写出来的代码没有 bug、没有内存泄露、接口易用就已经满足要求了,至于 real-time safe 是啥,根本没听过。直到开始接触音频播放系统,才开始慢慢接触到了 real-time 的概念,周边的同事也分享了更多关于实时音频编程的知识。网络上对于实时音频编程的内容不多,主要有:Real-time audio programming 101: time waits for nothing,原创 2021-06-29 07:46:26 · 1841 阅读 · 0 评论 -
低延迟音频中的音频解码优化策略
前言延迟是指信号在系统中传输所需的时间。下面是常见类型的音频应用相关延迟时间:音频输出延迟时间是指从应用生成音频样本到样本通过耳机插孔或内置扬声器播放之间经历的时间。音频输入延迟时间是指设备音频输入装置(例如,麦克风)接收到音频信号到这些音频数据可供应用使用所经历的时间。往返延迟时间是指输入延迟时间、应用处理时间和输出延迟时间的总和。触摸延迟时间是指从用户触摸屏幕到应用接收到触摸事件之间经历的时间。预热延迟时间是指数据第一次在缓冲区加入队列后启动音频管道所需的时间。对于原创 2021-03-08 19:41:01 · 2223 阅读 · 0 评论 -
【音频处理】IIR滤波器设计(一)Biquad 滤波器
系列文章目录【音频处理】如何“认识”一个滤波器?【音频处理】滤波器设计简介前言在开始学习 IIR 滤波器之前,你还记得 z变换 吗?它可以简化数字滤波器的分析与设计,接下来内容将建立在 z变换 的基础上进行推导。如果你忘记了,那么可以在 【音频处理】如何“认识”一个滤波器? 复习下,除了z变换外,这篇博客中也提到的零点、极点等概念,相信这些会对你有帮助的。接下来,将从最简单的滤波器开始介绍,并最终引出今天的主角双二阶滤波器(Biquad Filter),要介绍的滤波器包括:一阶前馈滤波原创 2020-12-31 17:54:49 · 11875 阅读 · 4 评论 -
基于 CoreAudio 的音频编解码(二):音频编码
系列文章目录基于 CoreAudio 的音频编解码(一):音频解码基于 CoreAudio 的音频编解码(二):音频编码前言在 基于 CoreAudio 的音频编解码(一):音频解码 中,我们介绍了 Core Audio 中常见的数据结构和基本概念,如果你还没有看过这些内容,最好去看一看。Core Audio 表示音频的数据的方式并不是告诉你 ”hi,这是个 mp3 文件“ 那么简单。文件格式和文件内的音频数据格式之间有很大的区别。关于格式的很多内容看起来似乎很随意,但 Audio Fi原创 2020-11-24 15:43:19 · 955 阅读 · 0 评论 -
基于 CoreAudio 的音频编解码(一):音频解码
系列文章目录基于 CoreAudio 的音频编解码(一):音频解码基于 CoreAudio 的音频编解码(二):音频编码前言Core Audio 是iOS和MAC系统中的关于数字音频处理的基础,它是应用程序用来处理音频的一组软件框架,所有关于iOS音频开发的接口都是由Core Audio来提供或者经过它提供的接口来进行封装的。下图是 Core Audio 框架结构,其功能可谓是丰富且强大,几乎涵盖了所有与音频处理相关的内容。这篇文章中,我们关注 Core Audio 中编解码能力,也就原创 2020-11-24 15:42:29 · 1308 阅读 · 0 评论 -
JUCE 中的音频编解码
JUCE 中的音频编解码JUCE (Jules’ Utility Class Extensions)是由Raw MaterialSoftware发布的一套基于C++的跨平台应用程序框架类库(Windows, Mac,Linux)。JUCE的特殊之处在于其友好的用户界面以及强大的音频、图像处理能力。JUCE适合那些想使用干净、快捷、高层的API,而不想 把时间浪费在使用不同类库,面向不同平台上的开发者。JUCE能够胜任大型、复杂的应用程序(C++)的开发。与其他应用程序框架类似,JUCE有众多覆盖音频、原创 2020-11-08 19:42:00 · 1691 阅读 · 0 评论 -
基于 FFMPEG 的音频编解码(三):音频编码
音频编码基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译基于 FFMPEG 的音频编解码(二):音频解码基于 FFMPEG 的音频编解码(三):音频编码在前面文章中,我们了解如何用 FFMPEG 进行音频解码,今天我们来讨论音频编码一个很重要的概念是,编码与解码是一对逆过程。 回想一下,解码的时候我们是如何做的?下面代码是解码的关键部分:av_read_frame(ctx, packet);avcodec_send_packet(ctx, packet);原创 2020-10-11 16:19:41 · 1633 阅读 · 9 评论 -
基于 FFMPEG 的音频编解码(二):音频解码
音频解码在 Hello FFMPEG 我们已经知道如何安装 FFMPEG,并通过一个示例,演示了如何利在 cmake 在构建一个 FFMPEG 程序。今天,我们将进入主题,来聊聊利用 FFMPEG 对音频进行解码。基本知识首先介绍一些关于音频的重要概念,这些概念在后面的编解码中非常重要。Interleave VS Planar假设有一个 2 声道的音频,在代码中,我们可能有两种形式来存放这些音频数据。第一种,交织(Interleave)排放:LRLRLRLRLRLRLRLRLRLR第二种原创 2020-09-13 18:17:15 · 730 阅读 · 0 评论 -
基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译
Hello FFMPEGFFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序作为一名音频开发人员,最近在学习如何使用 FFMPEG 进行音频的编解码。网上大多数资料基于视频,在音频侧介绍较少,或者代码年代久远,已经跑不通了摸索一段时间后,我掌握了如何利用 FFMPEG 进行音频编解码的正确姿势,在此博客中记录。各位看官如发现有错误的地方,请留言指出,感激不尽。本文中,主要介绍如何安装 FFEMPG 以及运行如何正确调用 FFEMPG安装准确的说是安装 FFMPEG原创 2020-09-12 12:21:06 · 980 阅读 · 0 评论 -
音频特效:Flanger 和 Chorus
Introduction 开场白今天要讨论的是 Flanger 和 Chorus 这两个音效,它们也是基于 Delay 实现的,并且在实现和原理上,它们又有很多相似的地方。我们还是老规矩,先分别介绍这两种音效的具体效果,分析其实现细节,并最后给出两者的异同。Flanger 镶边音效首先是 flanger,中文译为“镶边”,原意指的是开盘式录音机的边缘为了产生 flanger 音效,可以用...原创 2020-04-26 10:00:47 · 5967 阅读 · 2 评论 -
【音频处理】如何“认识”一个滤波器?
Introduction对一段音频信号进行处理,例如添加一个音效,有时候我们要考虑这样的处理对音频的影响是什么?是提高了低频,还是提高高频?或者频率做周期变化?当然,你完全可以用耳朵来听,但是这么做难度太大了,毕竟并不是每个人都有一副金耳朵。即使你的耳朵非常好使,能够分辨最为细微的差别,但是你如何用人类能够理解的方式描述这种区别呢?毕竟并不是每个人都有莫言般的描述能力。综上,我们需要一种可以...原创 2020-03-18 17:53:06 · 3041 阅读 · 0 评论 -
音频特效:Delay 和 Vibrato
Delay line 延迟线今天我们将讨论 Delay 和 Vibrato 两种音频特效的技术原理和实现细节。Delay 和 Vibrato 都是基于 Delay line 实现的。Delay line 作为音频特效中重要的基础组件,它很容易实现,并且稍作修改就能够应用实现于不同的音效。Delay line 非常简单,它能功能是将一个信号进行延迟。通过使用多条 delay line,并加以不...原创 2020-03-03 08:00:01 · 2234 阅读 · 3 评论 -
信号生成及DFT的python实现
DFTDFT(Discrete Fourier Transform),离散傅里叶变化,可以将离散信号变换到频域,它的公式非常简单:X[k]=∑n=0N−1x[n]e−j2πkn/NX[k] = \sum_{n=0}^{N-1} x[n] e^{-j2\pi kn/N}X[k]=n=0∑N−1x[n]e−j2πkn/NX[k]X[k]X[k]:离散频率下标为k时的频率大小x[n]x[n...原创 2018-11-02 12:14:57 · 9708 阅读 · 4 评论 -
IDFT的python实现
IDFTIDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单:x[n]=1N∑k=0N−1X[k]ej2πkn/Nx[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N}x[n]=N1k=0∑N−1X[k]ej2πkn/NX[k]X[k]X...原创 2018-11-07 16:19:12 · 3866 阅读 · 0 评论 -
复正弦信号、实数信号的DFT
复正弦信号、实数信号的DFT本文将介绍复正弦信号和实数信号的DFT性质,内容包括:复正弦信号的定义以及DFT性质实数信号的定义以及性质代码实例复正弦信号首先说明,复正弦信号只是一种数学定义上的信号,在实际生活中没有发现过这种信号我们先来看一种较为简单且比较有规律的复正弦信号,它的定义如下:x1[n]=ej2πk0n/Nn=0,1,2,...,N-1x_1[n] = e^{j2...原创 2018-11-10 15:51:41 · 10460 阅读 · 3 评论 -
傅里叶变换的基本性质
文章目录傅里叶变换的基本性质线性性质平移性质对称性质卷积性质傅里叶变换的基本性质总的来说,傅里叶变换有这样几个性质:线性性质(Linearity)平移性质(Shift)对称性质(Symmetry)卷积性质(Convolution)参考 傅里叶变换-wikipedia线性性质线性性质:两个函数之和的傅里叶变换等于各自变换之和,反之亦然import numpy as npf...原创 2018-11-24 11:29:56 · 26465 阅读 · 0 评论 -
窗函数作用和性质
什么是窗函数?窗函数能够产生一段特定的信号,假定为w我们假设一段信号为x,给这段信号加窗,指的是将x乘上w下面的代码说明了这个过程import numpy as npfrom scipy.signal import get_windowimport matplotlib.pyplot as plt%matplotlib inlineM = 128 ...原创 2018-11-24 16:45:29 · 26478 阅读 · 3 评论 -
傅里叶变换的更多性质:相位展开、零相位窗等
傅里叶变换的更多性质除了上一篇博文傅里叶变换的基本性质所提到的性质外,傅里叶变换还有一些非常有用的性质和概念,包括:能量不变(Energy conservation)分贝幅度(Amplitude in decibels(dB))相位展开(Phase unwrapping)补零(Zero-padding)快速傅里叶变换(FFT)零相位窗(Zero-phase windowing)...原创 2018-12-05 11:12:24 · 5460 阅读 · 0 评论 -
信号处理与向量空间
文章目录信号处理与向量空间向量表示信号向量空间向量的内积基向量基于子空间的近似估计一个近似估计的例子:用多项式函数估计$\sin t$总结信号处理与向量空间向量表示信号一个离散信号序列能够很自然的表示成向量:x[n]=[x0,x1,⋯ ,xN−1]x[n] = [x_0, x_1, \cdots, x_{N-1}]x[n]=[x0,x1,⋯,xN−1]为...原创 2018-12-12 19:09:30 · 2891 阅读 · 0 评论 -
频域特征提取的Python实现(频谱、功率谱、倒频谱)
频域特征提取的Python实现(频谱、功率谱、倒频谱)本文只对 频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 做代码翻译,用python重写一遍,以加强对这些特征的理解1. 频谱from scipy.fftpack import fft, fftshift, ifftfrom scipy.fftpack import fftfreqimport numpy as npi...原创 2019-01-18 20:01:17 · 35787 阅读 · 7 评论 -
Karplus-Strong 算法简单介绍和实现
Karplus-Strong 算法简单介绍和实现本文为Coursera数字信号处理课程第一周内容,对相关课程刚兴趣的同学,请参看这里为了有更好的交互性,本文所有代码均上传至Microsoft Azure Notebooks,你可以在上面试听所有输出的音频,具体代码在这里什么是Karplus-Strong算法Karplus-Strong算法简单的说就是一种合成声音的算法,它不断的循环重复...原创 2018-09-26 20:19:57 · 3781 阅读 · 0 评论