精华内容
下载资源
问答
  • python 绘制三角函数Trigonometry is one of the most important parts in engineering and many times, therefore matplotlib.pyplot in combination with NumPy can help us to plot our desired trigonometric ...

    python 绘制三角函数

    Trigonometry is one of the most important parts in engineering and many times, therefore matplotlib.pyplot in combination with NumPy can help us to plot our desired trigonometric functions. In this article, we are going to introduce a few examples of trig-functions.

    三角学是工程学中最重要的部分之一,因此, matplotlib.pyplot与NumPy结合可以帮助我们绘制所需的三角函数。 在本文中,我们将介绍一些三角函数的例子。

    1)正弦函数 (1) Sine Function)

    s = np.sin(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='Sin(x)',
           title='Sine Plot')
    ax.grid()
    plt.show()
    
    
    Python | Plotting Trigonometric Functions (1)

    2)余弦函数 (2) Cosine Function)

    s = np.cos(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='(cosx)',
           title='Cosine Plot')
    ax.grid()
    plt.show()
    
    
    Python | Plotting Trigonometric Functions (2)

    3)切线函数 (3) Tangent Function)

    t = np.arange(0.0, 1, 0.01)
    s = np.tan(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='tan(x)',
           title='Tangent Plot')
    ax.grid()
    plt.show()
    
    
    Python | Plotting Trigonometric Functions (3)

    用于绘制三角函数的Python代码 (Python code for plotting trigonometric functions)

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Data for plotting
    t = np.arange(0.0, 24, 0.01)
    
    # Sine Plot
    s = np.sin(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='Sin(x)',
           title='Sine Plot')
    ax.grid()
    plt.show()
    
    # Cosine Plot
    s = np.cos(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='(cosx)',
           title='Cosine Plot')
    ax.grid()
    plt.show()
    
    # Tangent Plot
    t = np.arange(0.0, 1, 0.01)
    s = np.tan(t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='radians', ylabel='tan(x)',
           title='Tangent Plot')
    ax.grid()
    plt.show()
    
    

    Output:

    输出:

    Output is as figure
    
    
    

    翻译自: https://www.includehelp.com/python/plotting-trigonometric-functions.aspx

    python 绘制三角函数

    展开全文
  • 实现频谱分析。能显示信号与频谱图。主要是对正弦信号和三角波进行一维FFT变换,得到频谱
  • 理论出发点是频谱分析的傅里叶级数展开法,其主要特点是利用Mathematica软件强大的函数运算功能,具体解决了对阶梯波作频谱分析这个理论方法上可行,但实际计算手段无法给出结论的困难。并用此方法首次对数模转换器...
  • 周期锯齿波的三角函数形式的傅里叶级数展开式,共享学习。百度已有,只是这个不用下载券!不用下载券!不用下载券!
  • 傅里叶分析——三角函数

    千次阅读 2017-02-15 11:54:28
     抱歉让你失望了,以上我们讲解的只是傅里叶级数的三角函数形式。接下去才是最究极的傅里叶级数——指数形式傅里叶级数。但是为了能更好的理解指数形式的傅里叶级数,我们还需要一个工具来帮忙——欧拉公式。 ...

    一、嘛叫频域

      从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析。而我们也想当然的认为,世间万物都在随着时间不停的改变,并且永远不会静止下来。但如果我告诉你,用另一种方法来观察世界的话,你会发现世界是永恒不变的,你会不会觉得我疯了?我没有疯,这个静止的世界就叫做频域。

      先举一个公式上并非很恰当,但意义上再贴切不过的例子:

      在你的理解中,一段音乐是什么呢?

      

      这是我们对音乐最普遍的理解,一个随着时间变化的震动。但我相信对于乐器小能手们来说,音乐更直观的理解是这样的:

      

      好的!下课,同学们再见。

      是的,其实这一段写到这里已经可以结束了。上图是音乐在时域的样子,而下图则是音乐在频域的样子。所以频域这一概念对大家都从不陌生,只是从来没意识到而已。

      现在我们可以回过头来重新看看一开始那句痴人说梦般的话:世界是永恒的。

      将以上两图简化:

      时域:

      

      频域:

      

      在时域,我们观察到钢琴的琴弦一会上一会下的摆动,就如同一支股票的走势;而在频域,只有那一个永恒的音符。

      所(前方高能!~~~~~~~~~~~非战斗人员退散~~~~~~~)

      以(~~~~~~~~~~~~~~~前方高能预警~~~~~~~~~~~~~~前方高能~~~~~~~~)

      你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。

      (众人:鸡汤滚出知乎!)

      抱歉,这不是一句鸡汤文,而是黑板上确凿的公式:傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。

      而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起。

      二、傅里叶级数(Fourier Series)

      还是举个栗子并且有图有真相才好理解。

      如果我说我能用前面说的正弦曲线波叠加出一个带90度角的矩形波来,你会相信吗?你不会,就像当年的我一样。但是看看下图:

      

      第一幅图是一个郁闷的正弦波cos(x)

      第二幅图是2个卖萌的正弦波的叠加cos(x)+a.cos(3x)

      第三幅图是4个发春的正弦波的叠加

      第四幅图是10个便秘的正弦波的叠加

      随着正弦波数量逐渐的增长,他们最终会叠加成一个标准的矩形,大家从中体会到了什么道理?

      (只要努力,弯的都能掰直!)

      随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又抵消了上升到最高处时继续上升的部分使其变为水平线。一个矩形就这么叠加而成了。但是要多少个正弦波叠加起来才能形成一个标准90度角的矩形波呢?不幸的告诉大家,答案是无穷多个。(上帝:我能让你们猜着我?)

      不仅仅是矩形,你能想到的任何波形都是可以如此方法用正弦波叠加起来的。这是没有接触过傅里叶分析的人在直觉上的第一个难点,但是一旦接受了这样的设定,游戏就开始有意思起来了。

      还是上图的正弦波累加成矩形波,我们换一个角度来看看:

      

      在这几幅图中,最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。一定有细心的读者发现了,每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波!也就是说,为了组成特殊的曲线,有些正弦波成分是不需要的。

      这里,不同频率的正弦波我们成为频率分量。

      好了,关键的地方来了!!

      如果我们把第一个频率最低的频率分量看作“1”,我们就有了构建频域的最基本单元。

      对于我们最常见的有理数轴,数字“1”就是有理数轴的基本单元。

      (好吧,数学称法为——基。在那个年代,这个字还没有其他奇怪的解释,后面还有正交基这样的词汇我会说吗?)

      时域的基本单元就是“1秒”,如果我们将一个角频率为的正弦波cos(t)看作基础,那么频域的基本单元就是

      有了“1”,还要有“0”才能构成世界,那么频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!所以在频域,0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。

      接下来,让我们回到初中,回忆一下已经死去的八戒,啊不,已经死去的老师是怎么定义正弦波的吧。

      

      正弦波就是一个圆周运动在一条直线上的投影。所以频域的基本单元也可以理解为一个始终在旋转的圆

      不能传动态图真是太让人惋惜了……

      想看动图的同学请戳这里:

      File:Fourier series square wave circles animation.gif以及这里:

      File:Fourier series sawtooth wave circles animation.gif点出去的朋友不要被wiki拐跑了,wiki写的哪有这里的文章这么没节操是不是。

      介绍完了频域的基本组成单元,我们就可以看一看一个矩形波,在频域里的另一个模样了:

      

      这是什么奇怪的东西?

      这就是矩形波在频域的样子,是不是完全认不出来了?教科书一般就给到这里然后留给了读者无穷的遐想,以及无穷的吐槽,其实教科书只要补一张图就足够了:频域图像,也就是俗称的频谱,就是——

      

      再清楚一点:

      

      可以发现,在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线。振幅为0的正弦波。

      动图请戳:

      File:Fourier series and transform.gif老实说,在我学傅里叶变换时,维基的这个图还没有出现,那时我就想到了这种表达方法,而且,后面还会加入维基没有表示出来的另一个谱——相位谱。

      但是在讲相位谱之前,我们先回顾一下刚刚的这个例子究竟意味着什么。记得前面说过的那句“世界是静止的”吗?估计好多人对这句话都已经吐槽半天了。想象一下,世界上每一个看似混乱的表象,实际都是一条时间轴上不规则的曲线,但实际这些曲线都是由这些无穷无尽的正弦波组成。我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。那么你的脑海中会产生一个什么画面呢?

      我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的。在最外面的小齿轮上有一个小人——那就是我们自己。我们只看到这个小人毫无规律的在幕布前表演,却无法预测他下一步会去哪。而幕布后面的齿轮却永远一直那样不停的旋转,永不停歇。这样说来有些宿命论的感觉。说实话,这种对人生的描绘是我一个朋友在我们都是高中生的时候感叹的,当时想想似懂非懂,直到有一天我学到了傅里叶级数…






    下面继续开始我们无节操的旅程:

      上次的关键词是:从侧面看。这次的关键词是:从下面看。

      在第二课最开始,我想先回答很多人的一个问题:傅里叶分析究竟是干什么用的?这段相对比较枯燥,已经知道了的同学可以直接跳到下一个分割线。

      先说一个最直接的用途。无论听广播还是看电视,我们一定对一个词不陌生——频道。频道频道,就是频率的通道,不同的频道就是将不同的频率作为一个通道来进行信息传输。下面大家尝试一件事:

      先在纸上画一个sin(x),不一定标准,意思差不多就行。不是很难吧。

      好,接下去画一个sin(3x)+sin(5x)的图形。

      别说标准不标准了,曲线什么时候上升什么时候下降你都不一定画的对吧?

      好,画不出来不要紧,我把sin(3x)+sin(5x)的曲线给你,但是前提是你不知道这个曲线的方程式,现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

      但是在频域呢?则简单的很,无非就是几条竖线而已。

      所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

      再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

      傅里叶分析当然还有其他更重要的用途,我们随着讲随着提。

      ————————————————————————————————————

      下面我们继续说相位谱:

      通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。那么这个相位谱在哪呢?我们看下图,这次为了避免图片太混论,我们用7个波叠加的图。

      

      鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位。

      

      这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作2Pi或者360度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2Pi,就得到了相位差。

      在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱。所以,频谱是从侧面看,相位谱是从下面看。下次偷看女生裙底被发现的话,可以告诉她:“对不起,我只是想看看你的相位谱。”

      注意到,相位谱中的相位除了0,就是Pi。因为cos(t+Pi)=-cos(t),所以实际上相位为Pi的波只是上下翻转了而已。对于周期方波的傅里叶级数,这样的相位谱已经是很简单的了。另外值得注意的是,由于cos(t+2Pi)=cos(t),所以相位差是周期的,pi和3pi,5pi,7pi都是相同的相位。人为定义相位谱的值域为(-pi,pi],所以图中的相位差均为Pi。

      最后来一张大集合:

      

      好了,你是不是觉得我们已经讲完傅里叶级数了?

      抱歉让你失望了,以上我们讲解的只是傅里叶级数的三角函数形式。接下去才是最究极的傅里叶级数——指数形式傅里叶级数。但是为了能更好的理解指数形式的傅里叶级数,我们还需要一个工具来帮忙——欧拉公式。

      欧拉公式,以及指数形式的傅里叶级数,我们下一讲再讲。谢谢大家(鞠躬)。

      —————————————————————————————————————

      今天讲的部分不多,但是我希望大家能够理解,我也有自己的生活,留给知乎的时间并不多,但是我很喜欢在知乎与别人交流的过程。上一次的那些文章大家知道我当时写了多久么?四天,每天写6小时那种,而且当时还是在假期。主要是图太不好做了,有人问到作图的方法,其实就是简单的MATLAB+PHOTOSHOP,作图的确是很费时间,但是我相信做出这些图是值得的,因为我相信图一定比文字更好理解。也希望可以将这些自己学习时的感受和经验更完整的分享给需要的人。

      所以请大家稍微有点耐心,我会认真把这个故事讲完。也谢谢大家的理解和支持。


    展开全文
  • 上图的直流分量计算有误,必须更正: 按照“ 该点的模值除以N/2就是对应 该频率下的信号的幅度(对于直流信号是除以N)” 得到结果如下: 此图中的80HZ, 160HZ频谱幅度,直流分量幅度与理论值吻合。OK!! 此图为...

    cos参数为弧度
    180-------pi

    在这里插入图片描述
    //t_int_data=cos(i2pi/100);//--------100为周期, 8192个点,包含了81.92个周期
    在这里插入图片描述
    幅度增加
    t_int_data=3cos(i2*pi/100);

    在这里插入图片描述
    t_int_data=5+ 3cos(i2*pi/100);
    加直流分量

    在这里插入图片描述
    t_int_data=5+ 3cos(i2pi/100-pi30/180);
    相位移动

    在这里插入图片描述
    t_int_data=5+ 3cos(i2pi/100-pi30/180) + 2cos(i2pi/50-pi50/180);
    双波叠加
    8192/100-------------> 82HZ
    8192/50--------------->164HZ

    在这里插入图片描述
    打印出直流分量
    t_int_data=5+ 3cos(i2pi/100-pi30/180) + 2cos(i2pi/50-pi50/180);

    上图的直流分量计算有误,必须更正:
    按照“ 该点的模值除以N/2就是对应
    该频率下的信号的幅度(对于直流信号是除以N)”
    得到结果如下:
    在这里插入图片描述
    此图中的80HZ, 160HZ频谱幅度,直流分量幅度与理论值吻合。OK!!

    在这里插入图片描述
    此图为FFT之后 实部,虚部值打印。

    展开全文
  • 为了印证“声音能用三角函数来表示”,我们当然需要用正余弦波来合成信号。所使用的正余弦波参数(频率、振幅和相位)就是我们在分析中得到的数据。 在此,我们主要探讨正弦部分的合成(即不讨论2.5.中的“噪声”和...

    摘要:正弦模型(Sinusoidal Modeling)指的是用一系列振幅、频率和相位不断变化的正弦波来拟合音频。其有非常丰富的应用场合。相比于非常成熟的线性预测模型(Linear Prediction),中文技术社区对于正弦模型的介绍并不足够。本文参考了十余篇英文文献,阐述这一模型的思想和实现思路,解释其中的技术细节。


    本文由@EthanLifeGreat/@EthanUnbeaten原创发表于CSDN

    1.前言

    模型的目的在于用相对熟悉的属性来描绘未知的事物。而将音频看作是不同的正弦信号的叠加是一个看起来比较自然的想法(其中存在的不合理之处将会在后面提及)。

    如果能够实现,那么建模者对于音频的整体属性就能形成直观的理解,同时有利于对音频进行想要的调整。

    在介绍模型之前,请允许笔者先对相关概念进行简单介绍。

    1.1.声码器(The Digital Phase Vocoder)

    用正弦波来拟合声波的办法最早在70年代由Moor提出1。后来经过完善,发展出了声码器2

    声码器将声音信号与多个滤波器相卷积(其本质是离散傅里叶变换)得到多个频率的子带(subband / DFT bin),以及子带上的振幅和相位。

    Portnoff, M.R. 1976的图1

    后来发明的MPEG音频编码方式也是基于这个思想——对不同的子带分配不同比特(信息计量单位)。清晰记录音频中人耳敏感的部分;模糊记录不敏感的部分。

    尽管声码器的实践和正弦模型的实践方式接近,其本质的思维方式是不同的。DPV注重于固定频率通道(channel)的内容,没法沟通相邻的频率通道,故对刻画跨通道变化的频率并不完美。

    对此,Smith等人3和McAulay等人4独立地提出峰值跟踪(Peak Tracking)的解决方案,正式地将正弦波的概念引进模型。这将是本文讨论的重点。


    2. 分析(Analysis)

    2.1. 短时傅里叶变换(STFT)

    如前面所言,需要用正弦波来表示音频信号,必须找到正弦波们的频率、对应的振幅和对应的相位。对此,我们需要的频率分析工具是傅里叶变换(Fourier Transform, FT),具体而言,是离散傅里叶变换(DFT)。后者是前者在计算机上的版本。

    然而仅仅进行一次DFT是不足够的,我们首先需要对音频在时间上进行分帧(frame),对每一帧独立地进行DFT,这被称为短时傅里叶变换(STFT)/离散短时傅里叶变换(DSTFT). 这么做的原因在于:我们希望在每一个帧里,具有平稳性——例如(在语音分析里)最多存在一个音素(phone). 夸张地讲,如果含有两个字的音频片段被同时送入DFT进行分析,我们便难以分析字的内容,也难以辨别两个字的先后顺序。

    由于稳定性的影响,我们需要让每一帧尽可能短。然而对于DFT而言,过短的信号意味着更少的信息,将会使频谱的分辨率下降,使得我们难以区分频率相近的成分。其中,FT的时间分辨率和频率分辨率满足反比例关系:分析帧时间越短(时间分辨率高),则频率分辨度越低;反之亦然。这被称为Gabor极限(Gabor–Heisenberg Limit)5.

    因此,对帧率(每秒分割的帧数)的选择也是STFT的一门艺术。新竹清华大学的劉奕汶教授6对此有一句总结:“(窗长)尽量长,不能太长。”

    其中的窗长等于帧长,由于截取分析帧后通常要加分析窗,而分析窗的长度与帧长相等。对于分析窗的介绍,可以参考Harris的文章7. 对此我之前的 文章 也有简要论述。

    更详尽地了解STFT,或可参见Matlab官方封装的函数 stft.m . 受篇幅限制,本文不再赘述。

    2.1.1.零延拓(Zero-padding)

    进行离散傅里叶变换前,为了提高变换后的频率分辨率——即更接近的DTFT的连续的结果——我们需要对加窗后的信号进行零延拓,即在信号后面补零。

    由于FFT的运算性质,一般将补零后的长度为2的某次方(视情况而定,如1024,4096等)。

    另外,为了使得相位一致,应使加窗信号居于DFT输入的正中间(x取0处),其余部分为补足的零。如下图(图源8):
    原信号 加窗信号 延拓信号 信号频谱
    从上至下以次为:(a)原信号 (b)加窗信号 (c)延拓信号 (d)信号频谱。

    2.2.峰值检测与估计(Peak Detection and Estimation)

    对帧内容进行N点DFT/FFT后,可以得到一个自变量为频率的离散的复值函数。函数值的绝对值为频率处对应振幅,虚部与实部之比的反正切值为相角。

    峰值指的是对于振幅谱上的极大值点。

    一般认为,只有较大的峰值才是频谱中有价值的内容。而那些较最大峰值低80dB以上的峰值,将难以被听到且其分辨率很低9。对存在这些峰值的音频分析结果进行调整(如变调)可能带来音频质量下降。

    同时,某些峰值可能并非真正存在于原本的音频内容中,而是源于离散傅里叶变换过程。例如一个被正弦窗截断的正弦波,经过DFT后会出现许多的峰值:
    正弦波及其对应频谱

    因此,峰值检测的流程并不仅仅包括找到极大值点,还在于对找到的极大值点进行筛选,即:

    • 删掉不重要的极大值点
    • 删掉本身不存在于音频中的峰值等

    一个峰值检测的结果例子如下图,叉为峰值(图源9):

    峰值检测
    然而如第一段所言,尽管此函数在图上看起来连续,但其仍是离散函数,要高效地找到隐藏的极大值点(即峰值估计),可以使用插值法(interpolation).

    2.2.1. 二次曲线/抛物线插值(Quadratic/Parabolic Interpolation)

    在对数谱上取振幅最值点附近三点,进行二次曲线/抛物线插值(Quadratic/Parabolic Interpolation),得到估计出的最值点10,再据此对相位进行线性拟合。二次插值示意图如下(图源新竹清华大学课件6):

    二次插值示意图
    注意插值进行的纵坐标是分贝dB(对数谱),经验证明,在对数谱上进行二次插值的精确度比在线性谱上的精确率高一倍8

    另外,除了使用DFT分析出频率成分,还有学者使用最优化的思想,迭代计算出音频中主要成分的振幅、频率和相位,这被称为“使用合成来分析”11(Analysis-by-synthesis, ABS)12

    2.3. 音高检测(Pitch Detection)

    找到了峰值之后,我们可以选择进行音高检测。这可以对之后的分析带来某些方便。

    在此之前我们需要先介绍一些音乐方面的概念。

    音高(Pitch)的是音乐领域里比较模糊的一个概念,笔者比较认同的一个解释是——听感上最相近的纯音的频率(a percept that can be compared against that of a pure tone)6

    音高通常被直观地定义为基频(Fundamental Frequency),基频可以被定义为泛音/谐波(partial/harmonic)序列里的公因数。例如,钢琴键C4的基频是261.6Hz,但其频谱成分却包含许多(近似于13)261.6的倍数的成分,如下(图源14):
    钢琴C4键的STFT频谱
    基于以上知识,我们不难想象检测音高(基频)的算法设计过程。但是,音高检测又有什么好处呢?

    • 判断噪音。如果某个峰值离基频的任何倍数都较远,那么这个峰值很可能不属于这个音。
    • 改善分析窗的长度。知道了某个帧中的音的音高,便可以设置合适的分析窗长度,以获得更好的时间-频率效益取舍9。这种分析法也被称为“音高-同步分析”11(Pitch-synchronous Analysis).
    • 便于调整音高。如果对音频音高进行调整时直接将所有的频率成分乘以某一倍数,则会放大谐波与基频倍数之间的差距13,使得改变后音频变得更加不和谐12

    2.4. 峰值连接(Peak Continuation/Peak Matching)

    峰值连接的本质是把相邻帧内的峰值相连,更确切地说是将相邻帧内对应频率的峰值相连,因此也被称为峰值匹配(matching). 而对应频率一般意味着彼此在各自帧内的频率最接近。

    这么做的理论基础在于,我们确信一个稳定的声音由多个频率近似稳定,而振幅不断变化的成分构成。那么,为了得到对声音的更连续的描述,我们可以基于这个假设,对相邻帧内的峰值内插,也相当于去掉了“帧”这个离散的存在。以下是连接的示意图(图源15):
    峰值连接示意图

    其操作大致流程是,为帧内的每一个峰值在下一个帧内找一个最相近的峰值。在满足相连接的峰值频率差小于一个给定值的前提下,对产生的冲突(多连一、一连多)按照一定规则进行解决。如果一个峰值在下一个帧找不到对应的连接,则被视为是一个轨道(track/trajectory)的死亡(death);而如果一个峰值没有被前一个帧中的峰值对应,则被视为是一个轨道的诞生(birth)。

    关于峰值连接中类似的概念表述有许多,其最终功能近似,不一一列举。

    2.5. “正弦+噪声+暂态”模型(Sinusoidal+Noise+Transient)

    本节简要解决一下音频中正弦波不能很好拟合的部分。

    前面提到,正弦波只适合于拟合一个稳定的声音(如乐音)。而对于噪声(如雨声)或者暂态声音(如打击音/Attack)都没办法很好地拟合。

    例如,以下是一段人声的峰值连接结果(图源15):
    一段人声正弦模型的拟合结果
    其中的清音部分(Unvoiced Segment)峰值多、轨道短,这样模型拟合效率低、效果差。而相比下浊音部分(Voiced Segment)显得合适很多。

    2.5.1. “正弦+噪声”模型(Sinusoidal+Noise)

    了解过语音识别的同学可能知道,清音其实就近似于噪音。于是,我们有了“正弦+噪声”模型,或叫“决定+随机”模型(Deterministic+Stochastic)16

    它首先拟合出正弦波成分,又叫确定性(Determinisitic)成分,剩下的部分称为剩余(Residual)。

    对于正弦波拟合不好的剩余,该模型视其为在不同频率部分能量不同的噪声17。我们只记录其大致位置的振幅,也就是描绘出它频谱的包络,如下图b子图中的折线(图源9)。
    原频谱和去除正弦波后的频谱
    这种做法会模糊频率的精度,同时丢失相位信息,但好处是可以用较少的数据量表示正弦波无法拟合的噪声。

    2.5.2. 暂态模型(Transient Model)

    暂态主要指敲击瞬间发出的声音,即ADSR包络中的(时间很短的)Attack。

    这一部分无法很好地用正弦波或噪声的办法拟合18。有一种解决办法是先把暂态时间段剥离出来,不对之进行分析,等合成的时候直接给拼回来19

    Verma等人18则认为这种做法不符合正弦模型的“变通精神”(the flexible spirit),同时这种在时域上剥离暂态也会带走某些噪声。因此,他们提出了对暂态建模的办法。

    Verma等人的做法是,对暂态部分先进行离散余弦变换(Discrete Cosine Transform, DCT)20,定义如下:
    C [ k ] = β [ k ] ⋅ x [ n ] ⋅ c o s [ ( 2 n + 1 ) k π 2 N ] C[k]=\beta[k] \cdot x[n]\cdot cos[\frac{(2n+1)k\pi}{2N}] C[k]=β[k]x[n]cos[2N(2n+1)kπ]
    其中 k = 1 k=1 k=1 β [ k ] = 1 N \beta[k]=\sqrt{\frac{1}{N}} β[k]=N1 ,否则 β [ k ] = 2 N \beta[k]=\sqrt{\frac{2}{N}} β[k]=N2 .

    简单而言,DCT可以将冲激信号转换为余弦函数。进而便于进行正弦拟合。如,一个指数速度衰减的信号和其经DCT变换后形式如:
    一个指数速度衰减的信号和其经DCT变换后形式

    暂态模型分析/合成流程如下:
    暂态模型分析、合成流程图
    与“正弦+噪声”模型相结合时,可以按暂态、正弦、噪声的顺序也可以按正弦、暂态、噪声的顺序进行分析。

    其实写完这一节才发现有许多的暂态模型,可以参考斯坦福大学CCRMA21网页了解更多


    3. 合成(Synthesis)

    合成的意思是用分析得到的参数化表示,合成出近似于原来的任何想要的音频。

    为了印证“声音能用三角函数来表示”,我们当然需要用正余弦波来合成信号。所使用的正余弦波参数(频率、振幅和相位)就是我们在分析中得到的数据。

    在此,我们主要探讨正弦部分的合成(即不讨论2.5.中的“噪声”和“暂态”部分)。介绍三种合成办法,它们分别是:“仅振幅合成法”11(Magnitude-Only Synthesis)、相位内插合成法(Phase Interpolation Synthesis)和帧重叠相加法(Overlap-Add Synthesis)。

    3.1. “仅振幅合成法”(Magnitude-Only Synthesis)

    顾名思义,这个办法仅使用分析得到的频率和对应的振幅(不用相位)进行合成。

    这个办法(相较于相位内插)可以大大简化合成的流程,理解起来也比较直观——

    比如做实验的时候,我们想生成一个频率为f的正弦波,我们一般会忽略相位:

    t = linspace(0,1,44100);		% 时间线(s)
    A = 1;							% 振幅
    f = 1000;						% 频率(Hz)
    signal = A*sin(2*pi*f.*t);		% 频率1000Hz,相位为0的正弦波
    

    但其实相位(0)隐藏在了里面。

    在许多场合下,人耳对于相位是不敏感的,例如你基本没法用耳朵区分这两个信号:

    signal1 = A*sin(2*pi*f.*t)
    signal2 = A*cos(2*pi*f.*t)
    

    这就赋予了只用振幅合成法的现实意义。

    “仅振幅合成”的具体的操作办法是:对于2.4.中连接好的每一条轨迹,设其初始相位为0(或者其它某值,效果相同),逐采样点迭代相位并内插振幅后,取各点正弦值,最后按时间顺序将所有轨迹的正弦值对应相加。 其表达式为:

    ∑ 所 有 轨 迹 j A j [ n ] ⋅ c o s ( ϕ j , n ) \sum_{所有轨迹j}^{}A_j[n]\cdot cos(\phi_{j,n}) jAj[n]cos(ϕj,n)
    其中,(省略 j j j
    ϕ n = ϕ n − 1 + 2 π f s ⋅ f [ n ] \phi_{n}=\phi_{n-1}+\frac{2\pi}{f_s}\cdot f[n] ϕn=ϕn1+fs2πf[n]
    其中,n表示时域顺序,即n=0表示该轨迹的起点, ϕ 0 \phi_0 ϕ0=0, f s f_s fs表示采样频率(下同).

    A[n]与f[n]是由分析结果(A[m]与f[m])线性内插而来的振幅和频率序列,满足:
    A [ n ] = A [ m ] + A [ m + 1 ] − A [ m ] Δ t ⋅ f s ⋅ n A[n]=A[m]+\frac{A[m+1]-A[m]}{\Delta t\cdot f_s}\cdot n A[n]=A[m]+ΔtfsA[m+1]A[m]n
    f [ n ] = f [ m ] + f [ m + 1 ] − f [ m ] Δ t ⋅ f s ⋅ n f[n]=f[m]+\frac{f[m+1]-f[m]}{\Delta t\cdot f_s}\cdot n f[n]=f[m]+Δtfsf[m+1]f[m]n
    这两条等式非常直观,就是直线的两点式,其中 Δ t \Delta t Δt为相邻分析帧的中心位置时间差。

    关于不考虑相位的弊端和适用场合的讨论将放在下一节进行。

    3.2. 相位内插合成法(Phase Interpolation Synthesis)

    这节我们讨论考虑相位的合成办法。

    考虑相位的合成法需要将相位也进行内插,即确定帧与帧间各点的相位信息。

    3.2.1. 三次多项式内插法(Cubic Polynomial Interpolation)4

    不同于振幅内插和3.1.中的频率内插的线性办法,相位内插所使用的内插办法是三次方(cubic)的。

    为什么是三次?首先我们讲讲为什么不能是线性(一次)或二次的。这是因为:

    • 频率是相位的导数,要保证相位曲线在两端的导数值是对应的频率。
    • 分析时得到的相位只是对 2 π 2\pi 2π 取模的结果,在 [ − π , π ] [-\pi,\pi] [π,π] 间。

    这时我们需要对相位进行加 M ⋅ 2 π M\cdot 2\pi M2π 展开(unwrap),M 为某待定整数。再用其它先验知识来求出最合适的M。

    例如4文中的图6,展示了五种可能 M 带来的内插结果:
    5种可能的三次内插结果

    如何从中选择最合适的M呢?作者McAulay等人提出的办法是,找一个“最平滑的”(maximally smooth)曲线,也就是曲线的二次导数的平方的线积分最小。即求整数M,使得

    f ( M ) = ∫ 0 T [ θ ′ ′ ( t ; M ) ] 2 d t f(M)=\int_0^T{[\theta''(t;M)]^2dt} f(M)=0T[θ(t;M)]2dt
    最小。

    得到相位后取余弦,点乘线性内插后的振幅即可,再把所有轨迹相加即可:4
    相位内插合成法流程图

    3.2.2 相位的意义

    尽管我们听不出正弦波和余弦波的差别,在许多的情况下,人对于相位是敏感的,这些情况是:

    • 对象分析过程不当9
    • 非常低沉的乐器声音(低于30Hz9,低于100Hz4)
    • 某些人声(含有较高的泛音)9
    • 含有噪音的语音片段(会导致合成的噪音部分有一种不真实和令人厌烦的音效)4

    一个大提琴波形、带相位和不带相位合成的结果对比图如下:16
    原波形、带相位和不带相位合成的结果对比图

    可以看出带相位的合成法基本保持了原来的波形(而且几乎完美复刻),反观不带相位的就不知道是哪跟哪了(虽然听起来可能差不多)。

    3.3. 帧重叠相加法(Overlap-Add/OLA Synthesis)

    这种办法事实上并没有进行峰值连接,它只是单纯地把每一帧的内容合成出来,再按一定规则拼加在一起。其中叠加的意义在于使帧和帧之间过度自然。

    每个帧内的每个峰值对应一段正弦波,其振幅、频率恒定,相位由中心相位和频率共同决定,也是用频率逐点迭代。

    方便起见,这里直接写代码了,毕竟够短。

    leftHalf = floor(N/2);	  % N是帧内的采样点数
    startPha = pha - (leftHalf+1)*freq;	% pha是分析得到的相位,freq是分析得到的频率,均视作中心相位、频率。
    phas = startPha + freq.*(1:N);
    y = sum(amp.*cos(phas), 1);       % 所有正弦波相加
    

    合成好了帧内的内容便可以进行叠加了。叠加前要进行加窗,这里要保证窗叠加的结果是常数,这被称为常数叠加(Constant Overlap-Add, COLA).

    关于COLA,中文社区里已经有很多介绍了,不再赘述。

    4. 结语

    本文主要介绍了Sinusoidal Modeling的分析、合成过程。讨论了实践中的一些细节。

    关于本文的编程实现,可以参考笔者的Gitee项目基于Matlab的正弦模型项目。到底能不能用三角函数表示声音?运行代码听听区别就知道啦。

    下一篇文章我们将讨论正弦模型的一些实际应用场合。

    欢迎读者就文章及相关内容留言探讨。


    注脚


    1. Moorer, J. A. 1973. “The Hetrodyne Filter as a Tool for Analysis of Transient Waveforms.” MemoAIM-208, Stanford Artificial Intelligence Laboratory, Computer Science Dept., Stanford University. ↩︎

    2. Portnoff, M.R. 1976. “Implementation of the Digital Phase Vocoder Using the Fast Fourier
      Transform.” IEEE Transactions on Acoustics, Speech and Signal Processing 24(3):243–248. ↩︎

    3. Smith, J.O. and X. Serra. 1987. “PARSHL: An Analysis/Synthesis Program for Non-HarmonicSounds based on a Sinusoidal Representation.” Proceedings of the 1987 International Computer Music Conference. San Francisco: Computer Music Association. ↩︎

    4. McAulay, R.J. and T.F. Quatieri. 1986. “Speech Analysis/Synthesis based on a Sinusoidal Representation.” IEEE Transactions on Acoustics, Speech and Signal Processing 34(4):744–754. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    5. GABOR, D. Acoustical Quanta and the Theory of Hearing. Nature 159, 591–594 (1947). https://doi.org/10.1038/159591a0 ↩︎

    6. http://ocw.nthu.edu.tw/ocw/index.php?page=course&cid=130& ↩︎ ↩︎ ↩︎

    7. F.J. Harris, On the use of windows for harmonic analysis with the discrete Fourier transform, Proc. IEEE 66 (1) (1978) 51–83. ↩︎

    8. Smith, Julius & Serra, Xavier. (2005). PARSHL: An Analysis/Synthesis Program for Non-Harmonic Sounds Based on a Sinusoidal Representation. Proceedings of the International Computer Music Conference. ↩︎ ↩︎

    9. Serra, X. . Musical Sound Modeling with Sinusoids plus Noise. Musical Signal Processing. 1997. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    10. M. Abe and J. Smith, “Design criteria for simple sinusoidal parameter estimation based on quadratic interpolation of FFT magnitude peaks”, (AES 2004) ↩︎

    11. 未找到对应中文译名,笔者译。 ↩︎ ↩︎ ↩︎

    12. George, E. Bryan, Smith, Mark J. T. An Analysis-by-Synthesis Approach to Sinusoidal Modeling Applied to the Analysis and Synthesis of Musical Tones[J]. journal of the audio engineering society, 1991. ↩︎ ↩︎

    13. 声音的泛音/谐波频率通常并非基频的完美倍数。例如本文图6中,钢琴C4音的频谱的前五个谐波的频率比是1.0000 : 2.0000 : 3.0033 : 4.0075 : 5.016314。导致这种非整数的原因是琴弦僵硬的弯折22↩︎ ↩︎

    14. Szeto, Wai Man , and K. H. Wong . “Sinusoidal modeling for piano tones.” Signal Processing, Communication and Computing (ICSPCC), 2013 IEEE International Conference on IEEE, 2013. ↩︎ ↩︎

    15. McAulay, R. J., & Quatieri, T. F. (1988). Speech Processing Based on a Sinusoidal Model. The Lincoln Laboratory Journal, 1(2), 153–168. ↩︎ ↩︎

    16. Serra, X. 1989. “A System for Sound Analysis/Transformation/Synthesis Based on a Deterministic Plus Stochastic Decomposition.” PhD thesis, Stanford University. ↩︎ ↩︎

    17. 注:如果一个噪声在所有频率成分上能量都相等,则是白噪声(white noise);否则为有色噪声。相关内容参见百科词条“有色噪声”。 ↩︎

    18. Verma, T. S. , & Meng, T. H. Y. . (2000). Extending spectral modeling synthesis with transient modeling synthesis. Computer Music Journal, 24(2), 47-59. ↩︎ ↩︎

    19. Scott Nathan. Levine, Smith, & Julius Orion. (1998). Audio representations for data compression and compressed domain processing /. ↩︎

    20. Rao, Kamisetty & Yip, P… (1990). Discrete cosine transform. Algorithms, advantages, applications. ↩︎

    21. https://ccrma.stanford.edu/ ↩︎

    22. A. Askenfelt, Ed., Five Lectures on the Accoutics of the Piano. Royal Swedish Academy of Music, 1990, available online at http://www.speech.kth.se/music/5_lectures/. ↩︎

    展开全文
  • 基带信号为m(t), 粗暴一点,载波信号有多种,我们这里说调制就是乘上一个角频率为Wc=2πfc的余弦信号, 得到要发射的射频信号,也叫做已调信号, 这里面用到了三角函数的积化和差公式,看到没,调制后的信号里面...
  • 频谱泄露与窗函数

    2020-10-18 16:27:12
    频谱泄露与窗函数  今天,我想谈的是数字信号处理中的两个重要的问题,什么是频谱泄露,以及什么是窗函数,为什么使用窗函数。 文章目录频谱泄露与窗函数什么是频谱泄露一、频谱泄露是什么?二、窗函数的目的 ...
  • 抱歉让你失望了,以上我们讲解的只是傅里叶级数的三角函数形式。接下去才是最究极的傅里叶级数——指数形式傅里叶级数。但是为了能更好的理解指数形式的傅里叶级数,我们还需要一个工具来帮忙——欧拉公式。 欧拉...
  • 至此,就可以得到三角函数的弧度表示 a = cosx //x为弧度,周期为2π b = sinx //x为弧度,周期为2π (3)三角函数的角速度表示法 ω为匀速旋转的角速度,即单位时间旋转的角度。 θ = x = ωt //t是时间,...
  • 频谱分析常见的窗函数

    千次阅读 2019-09-24 14:08:41
    数字信号处理中,通常取有限时间片段进行分析。 具体做法:1>...FFT分析中为了减少或消除频谱能量泄漏及栅栏效应采用不同的截取函数对信号进行截短 截短函数称为窗函数,简称为窗。 泄漏与窗...
  • (转)频谱分析常见的窗函数

    千次阅读 2019-05-07 23:16:54
    数字信号处理中,通常取有限时间片段进行分析。 具体做法:1>从信号截取一个时间片段 ; 2>对信号进行傅里叶变换、相关分析。 信号的截断产生了能量泄漏 ...泄漏与窗函数频谱的两侧旁瓣有关 对于窗函数的选...
  • 数学家告诉我们三角函数、复指数函数正是合适的基底函数。 利用三角函数系或复指数函数系展开的函数级数被称为傅立叶级数。 周期为T的函数f(x)傅里叶级数展开如下: 数学家(知道我们不会算)同时告诉了我们系数: ...
  • 本文主要介绍了常见的窗函数以及窗函数有什么用,以及在实时频谱分析中,该如何选择合适的加窗方式。 随着无线通信的逐步发展,带来的是频谱环境的越发复杂与丰富,高度的信号变化性使得短时间内信号不再是一成不变...
  • 做项目时老师要求用python,可是书上的列题使用matlab,在matlab完全不会和python只懂一点皮毛的情况下,硬着头皮绘出了第一个图,真的开心,撒花❀❀❀❀ import matplotlib.pyplot as plt import numpy as np ...
  • 实验结果表明:采用提出的改进的三角窗切趾函数能有效抑制频谱泄漏;相比于三角窗,改进的三角窗切趾函数平均峰-峰值信噪比提升了4.9%,方均根值信噪比提升了3.5%,优于常见窗中最优的布莱克曼窗。改进的三角窗切趾函数的...
  • 争取从零开始 一遍搞懂。 本章:【由于字数限制开新文章继续】复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
  • 任意周期函数都可以写成三角函数之和。 参考: 1、如何理解傅立叶级数公式? 2、如何通俗地解释欧拉公式(e^πi+1=0)? 3、
  • 首先从理论上公式推导了复数域傅里叶频谱求解方法与实数域三角函数频谱求解方法之间的等价条件,从而在离散傅里叶变换之外,找到了一种可求解时程曲线针对任意频率点频谱的三角函数频谱算法 。并针对阻尼体系的动力...
  • Xminilab-B 是一个具有多功能混合信号示波器、频谱分析仪、任意函数发生器。是一种多用途开发工具包,电路设计采用新的XMEGA微控制器设计。主要面向那些开始学习AVR微指令的群体。 Xminilab-B 实物展示: 具体参数...
  • 三角函数窗:应用三角函数,即正弦或余弦函数等组合成复合函数,例如汉宁窗、海明窗等; 指数窗。:采用指数时间函数,如e-st形式,例如高斯窗等。   下面介绍几种常用窗函数的性质和特点。   ...
  • 概率密度函数及其在信号方面的简单理解(中)一级目录二级目录三级目录 一级目录 二级目录 三级目录
  • 能生成任意的正弦波、方波、三角波、锯齿波波形数据,还支持手绘波形和频谱分析
  • 各种常见的窗函数,以及它们的时域图,非常清晰,
  • 频谱泄露

    万次阅读 2016-05-10 14:13:52
    fft在分析频谱分析的时候,会有下面四个方面的误差: (1)频谱混叠: 奈奎斯特定理已被众所周知了,所以几乎所有人的都知道为了不让频谱混叠,理论上采样频谱大于等于信号的最高频率。那和时域上联系起来的关系...
  • 三角函数窗:应用三角函数,即正弦或余弦函数等组合成复合函数,例如汉宁窗、海明窗等; 指数窗。:采用指数时间函数,如e-st形式,例如高斯窗等。 下面介绍几种常用窗函数的性质和特点。 (l) 矩形窗矩形窗使用最多...
  • Matlab并没有自带的求解傅里叶级数的函数,本文将介绍如何使用Matlab进周期函数的傅里叶级数分析,内容包括: 1、求解傅里叶级数的系数 2、求N次谐波的叠加函数,画图比较与原函数的差值 3、做出傅里叶级数的幅度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,904
精华内容 1,161
关键字:

三角函数的频谱