DSP
文章平均质量分 51
数字信号与音频处理
安安爸Chris
这个博客用于写自己兴趣所在的内容,主要是源码阅读和智能语音相关的。 我另一个博客主要写工作相关的,请参考https://www.jianshu.com/u/3f1c3f228fa5
展开
-
【sox】常用的音频处理脚本合集一
批量计算wav文件时长#!/bin/bashif [ $# != 1 ];then echo "specify the dir to do the calculation." exitfioutput_tmp="$1.tmp"output="$1.file_duration"for file in $1/*.wavdo dur=`soxi -d ${file}` Dur=`soxi -D ${file}` echo "$file $dur $Dur原创 2021-11-22 16:43:02 · 1948 阅读 · 0 评论 -
【sox】使用sox增加混响效果
使用sox增加混响只要一行命令即可,命令如下:如sox 1.wav 1_out.wav reverb 1 100 1 1 10 10命令参数含义与可取值的范围如下:sox input.wav output.wav reverb [reverberance 0~100] [hf_damping 0~100] [room_scale 0~100] [stere_depth 0~100] [pre_delay_ms 0~500] [web_gain_db -10~10]...原创 2021-09-24 18:12:20 · 1254 阅读 · 0 评论 -
使用python手写FFT算法
FFT(Fast Fourier Transform) 是 DFT(Discrete Fourier Transform)的快读实现,它在机理上没有改变DFT的算法,只是在实现上采用的巧妙的实现。 使O(N2)O(N^2)O(N2)的实现变成了O(Nlog2N)O(Nlog_2N)O(Nlog2N)的实现,优化算法的复杂度。DFT 公式DFT的公式我们先简单回忆一下:DFT的python实现def dft(x): x = np.asarray(x, dtype=float) N原创 2021-09-21 00:17:48 · 2610 阅读 · 2 评论 -
使用FFT来计算IFFT
使用FFT来计算IFFT公式DFT与IDFTDFT公式iDFT公式DFT计算iDFT公式推导FFT是DFT的一种快读计算方式,本质上的计算逻辑是一样的,所以下面使用DFT来讨论公式,应用于FFT是一样的公式DFT与IDFTDFT公式Xk=∑n=0N−1e−i2πNknxn,k∈{0,1,...N−1}X_k = \sum_{n=0}^{N-1}e^{-i\frac{2\pi}{N}kn}x_n , k\in \{0,1,... N-1\}Xk=n=0∑N−1e−iN2πknxn,k原创 2021-09-15 17:02:58 · 5827 阅读 · 1 评论 -
使用overlap-add方法计算两个信号的卷积示例(在频域计算卷积)
之前已经写过一篇使用overlap-add方法计算两个信号的卷积示例本篇将卷积部分的计算从时域改为频域,基本操作步骤不变示例代码如下:import numpy as npdef get_blocks(signal, block_length): a_length = len(signal) padding_length = block_length - 1 segments = -(-a_length // block_length) result = np.ze原创 2021-07-27 15:59:34 · 1715 阅读 · 0 评论 -
使用overlap-add方法计算两个信号的卷积示例
假设信号数组如下,使用overlap-add方法计算线性卷积a = [1, 3, -1, 2, 5, 3, -2, -4, -2, 1]h = [1, 2, -1]step1: 分组根据h长度划分ah长度为3,每3个一分,将a分为4组,如下:[[1, 3, -1],[2, 5, 3],[-2, -4, -2],[1,0,0]]最后一个数组不够补零处理。step2: 补零h的长度为3,M=3a被划分的长度为3, L=3所以每个block补零后的长度应该为N=L+M−1N原创 2021-07-27 15:03:12 · 2451 阅读 · 0 评论 -
【kissfft】使用kiss_fftr做FFT与iFFT
类似与kiss_fft的调用,本章具体使用kiss_fftr接口做FFT与iFFT的使用代码举例static kiss_fft_scalar rand_scalar(void) { kiss_fft_scalar s = (kiss_fft_scalar) ((rand() + 10) % 256); return s / 256.;}static void print_fft_result(kiss_fft_cpx *x, int n) { int l = 0;原创 2021-06-28 17:11:49 · 1640 阅读 · 0 评论 -
【kissfft】使用kiss_fft做FFT与iFFT
长时间没有使用kissfft有点忘记API的使用了,这里记录一下最最基本的使用。 FFT与iFFtFFT使用FFT的时候先初始化kiss_fft_cfg,其中第二个参数0/1表示是做fft还是ifftkiss_fft_state = kiss_fft_alloc(nfft, 0, 0, 0);构建输入参数kiss_fft输入参数是复数,但是我们时域的数据为实数,所以需要构建等长的复数参数,然后把时域信号赋值到real部分,image部分置0.iFFTkiss_fft_state = kiss原创 2021-06-28 15:51:28 · 4242 阅读 · 0 评论 -
根据时间点截取wav文件
有一个训练数据需要整理,主要是从阿里云实时ASR获取的结果,结果中有文本与时间点信息。比如#test begin endyes i have found a better 20400 23530记得应该可以使用python的pudub库处理该问题。不过我没有使用python,直接使用c写了一个工具。数量比较大,考虑c来的快一点。代码如下:#include <原创 2020-08-10 16:02:25 · 630 阅读 · 1 评论 -
使用libsndfile写一个简单的wav转pcm工具
#include <stdlib.h>#include <stdio.h>#include <sndfile.h>#include <memory.h>#define RAW_BUFF_SIZE 1024int main(int argv, const char *args[]) { if (argv!=2) { printf("please input wav file\n"); exit(0);原创 2020-07-13 14:42:52 · 711 阅读 · 0 评论 -
Vorbis窗简介
在所有窗函数中,大多你都可以在网上找到该窗函数的介绍,但是今天介绍的Vorbis窗,至少你不仔细找,可能还真找不到它的资料。Wikipedia里的窗函数介绍里是没有这个窗函数的。直接上干货窗函数公式w(n)=sin(π2sin2(πnN))w(n) = sin(\frac \pi2 sin^2(\frac{\pi n} N) )w(n)=sin(2πsin2(Nπn))窗函数图可以看到它的顶部更圆润,可以保留更多的信息。它与我们常见的Hann window相比呢通过对比可以看到他原创 2020-05-27 17:51:21 · 1371 阅读 · 1 评论 -
简易重采样resampler的实现
基于开源库speexdsp, 可以简单实现重采样。简单实现的代码如下:需要的三方库: speexdsp ,libsndfile#include <stdlib.h>#include <sndfile.h>#include <speex_resampler.h>#define BUFFER_SIZE 2048int main(int argv, const char *args[]) { if (argv != 4) { .原创 2020-05-27 16:25:32 · 3335 阅读 · 0 评论 -
有关包络Spectral Envelope的疑问
在有关MFCC的许多文章中,很多都是引用国外一篇PPT的。这篇地址在这里其中有关于Spectral Envelope(包络)的理解我一直有一些疑问。疑问为什么有如下假定?Spectrum = Spectral Envelope * Spectral Details正因为这个公式,才有后续的处理。但是对于这个我是挺好奇的。对此我做了一些简单的实验。实验Step1. 找一个单一...原创 2019-12-26 16:45:22 · 844 阅读 · 0 评论 -
【音频处理】从时域和频域上分别改变音频的响度
时域上尝试如原始音频时域如下:假如将所有数据乘上5. 可以发现有些地方都“破音”了。 for (int i = 0; i < N; ++i) { in[i] = in[i]*5; }效果如下,频域上的尝试这种操作在频域中也可以做。将时域数据通过DFT转成频域数据,然后在实数部分和虚数部分都乘以相同系数5。 for (int i = ...原创 2019-12-25 20:29:39 · 1276 阅读 · 0 评论 -
音频处理中频域转时域的恢复
本文中使用的语言为c++,使用的三方库为fftw,libsndfile音频的时域转频域这一部分主要使用傅里叶变换,将时域转成频域。这一块的帖子已经很多,这里不再赘述了。主要注意点如下:fftw库的使用,请参考 fftw官网libsndfile库的使用,请参考 libsndfile官网窗体采用汉宁窗,宽度为512ms,处理音频采样率为8k,16bit,单声道,窗体移动为1/2窗体宽度...原创 2019-12-16 17:05:17 · 3075 阅读 · 0 评论