音频处理中频域转时域的恢复

本文中使用的语言为c++,使用的三方库为fftw,libsndfile

音频的时域转频域

这一部分主要使用傅里叶变换,将时域转成频域。这一块的帖子已经很多,这里不再赘述了。主要注意点如下:

  • fftw库的使用,请参考 fftw官网
  • libsndfile库的使用,请参考 libsndfile官网
  • 窗体采用汉宁窗,宽度为512ms,处理音频采样率为8k,16bit,单声道,窗体移动为1/2窗体宽度
    汉宁窗函数
    汉宁窗函数如上所示

实现逻辑如下:

  1. 使用libsndfile读取wav文件,获取到double数组
  2. 制定窗宽度为512ms,sample长度为N=512*8
  3. 每个窗载入N个sample的数组,然后做傅里叶变换,调用fftw_plan_dft_r2c_1d函数,获取到复数数组。
    // HERE IS pseudocode
    double *in = (double *) fftw_malloc(N* sizeof(double));
    fftw_complex  *out = (fftw_complex *) fftw_malloc(N* sizeof(fftw_complex));
    ... ...

	for (int i = 0; i < N; ++i) {
        double multiplier = 0.5 * (1 - cos(2*M_PI*i/(N-1)));//Hanning Window
        in[i] =  wav[i]*multiplier;
    }
    ... ...
    plan = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);
	fftw_execute(plan);
  1. 窗体移动1/2窗体宽度,载入N个sample,再做一次步骤3
  2. 重复步骤4,直到窗体移动到文件末尾
    窗体移动示例

从频域恢复到时域

一般来说,在频域中我们会做一些处理,比如说滤波,将50HZ以下的频率去掉。可以在频域中轻松处理。处理后再使用傅里叶逆变换将频域数据恢复成时域数据。

如下将低频部分频率滤掉

	// HERE IS pseudocode
    for (int i = 0; i < N; ++i) {
        if (i<=50) {
            out[i][0] = 0;
            out[i][1] = 0;
        }
    }

再转回时域

    double *out2 = (double *) fftw_malloc(N* sizeof(double));
    fftw_plan backword_plan  = fftw_plan_dft_c2r_1d(N, out, out2, FFTW_ESTIMATE);
    fftw_execute(backword_plan);
    for (int i=0; i<N; ++i) {
        out2[i] = out2[i]/N; // normalization
    }

最后将数据写入wav文件。
写的时候注意。因为是有重复数据的(窗体是有一半重复的),所以重复的部分是要相乘处理的。

一些常见问题

为什么窗体宽度为512ms?

这个主要看主要分析的频谱范围,因为本人只关心2kHZ以下部分,为了达到这个频率,窗里的sample数必须达到4k以上。512*8=4096,达到要求即可。如果需要更高频率,需要按此计算。

频域转时域是否需要加窗?

上面的例子是没有的,但是实际上是需要的。

窗其实分为两种, 分析窗和合成窗
只是巧合的是位移1/2的汉宁窗(分析窗)+ 矩形窗(合成窗)正好可以还原信号。

还有一种组合是 1/2的正弦窗+ 正弦窗(合成窗)也是可以还原信号的。

为什么窗体位移为1/2?

原始信号乘以窗函数后,无论是哪一种,都会存在前后部分的信号衰减。这主要是因为窗函数的意义——它就是为了将窗体部分的信号趋近于周期的。
1/2的汉宁窗移动有个好处是,前一个窗体的后半部分乘以下一个窗体的前半部分,正好可以还原衰减信号。利用这个特性,所以选取位移为1/2.
汉宁窗位移

为何还原出来的音频听上去一段一段的?

这个问题的根因正如上一个问题的解答。那么为什么会出现这个现象?
周期性衰减
一般来说,原始信号没有使用窗函数,在还原的时候会出现这个现象。

因为在做傅里叶变换时,对变换的信号是由周期性要求的。但是真实环境中的声音是不可能的。所以我们需要加窗处理,将窗中的信号趋近于周期性。

如果非周期行函数做处理会发生什么?能量的泄露。主频率的能量会被分散到其他频率上。这种泄露的频谱再逆变换回来的时候,原信号必然发生失真。而傅里叶变换是一段一段处理的,所以最终的音频也会出现一段一段的失真。


如果您觉得有所帮助,请给与一定的支持和鼓励。感谢。
在这里插入图片描述

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 意思? 时域指标与频域指标是两种不同的信号分析方法,它们之间并不一一对应。时域指标是指信号在时间轴上的变化情况,如幅值、频率、相位等;而频域指标则是指信号在频率轴上的分布情况,如频谱、功率谱密度等。因此,它们之间并没有一一对应的关系。 ### 回答2: 时域指标与频域指标一一对应起来是指在信号处理时域频域这两种表示方式可以相互换,并且它们之间存在一一对应的关系。 时域指标是指在时间轴上观察信号的特性。它们描述了信号在不同时间点的振幅、幅度的变化以及信号的波形特征。常见的时域指标包括幅值、相位、时长、周期、上升时间、下降时间等。时域分析可以帮助我们了解信号的动态过程以及信号时域特性。 频域指标是指在频率域上观察信号的特性。它们描述了信号包含的不同频率成分的存在与强度。通过傅里叶变换可以将信号时域换到频域,将其表示为频率和振幅的函数。常见的频域指标包括频率谱、功率谱、频带宽度、谐波分析等。频域分析可以帮助我们了解信号的频率特性以及信号频域分布。 时域指标与频域指标之间的对应关系是通过傅里叶变换和反傅里叶变换实现的。傅里叶变换可以将时域信号换为频域信号频域信号可以表示为频率和振幅的函数。反傅里叶变换则可以将频域信号换回时域信号时域指标和频域指标之间的对应关系使得我们能够从不同的角度观察和分析信号。通过时域分析,我们可以了解信号在时间上的变化情况;而通过频域分析,我们可以了解信号各个频率成分的存在情况和强度。这样的对应关系在信号处理和通信系统都有广泛的应用,例如音频信号处理、图像压缩、频谱分析等。 ### 回答3: 时域指标与频域指标一一对应起来,是指一个信号时域上的特征与在频域上的特征之间存在一一对应的关系。 在时域上,信号的特征主要包括信号的幅度、相位和信号的时间变化特性。幅度表示信号的大小,相位表示信号的起始相位。信号的时间变化特性可以通过观察信号的波形来获得,例如信号的周期、脉冲宽度等。 在频域上,信号的特征主要包括信号的频率成分和信号的能量分布。频率成分表示信号所包含的不同频率的成分,能量分布表示不同频率成分的能量大小。通过对信号进行傅里叶变换,可以将信号时域换为频域,从而获得信号频域上的特征。 时域指标与频域指标之间的关系是通过傅里叶变换建立的。傅里叶变换可以将一个信号时域换为频域,从而得到信号在不同频率上的幅度和相位信息。通过反傅里叶变换,可以将一个信号频域恢复时域。因此,时域指标与频域指标之间存在一一对应的关系。 例如,一个信号时域波形反映了信号在时间上的变化特性,而在频域上,该信号的频谱显示了信号不同频率成分的幅度。通过分析时域波形和频谱,可以了解信号在时间和频率上的特征,从而得到时域指标和频域指标之间的对应关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值