五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【Aegisub】生成音頻頻譜的簡(jiǎn)單介紹

2021-06-15 03:16 作者:多華宮與火火里  | 我要投稿

????????Aegisub可以做各種各樣的頻譜效果,比如

????????如果要看效果,可以拖到文章末尾,看一些效果的示例。

????????先講一些零散的概念:

比特率(bit rate)指每秒傳送的比特(bit)數(shù),比特率越高,單位時(shí)間傳送的數(shù)據(jù)量(位數(shù))越大。一個(gè)二進(jìn)制數(shù)有幾位就有幾個(gè)bit(位),比如11101有5位那么就有5bit(把比特翻譯成中文就是位)

字節(jié)(btye)是計(jì)量存儲(chǔ)容量的一種單位,1個(gè)字節(jié)能儲(chǔ)存8位的二進(jìn)制數(shù),那么最大的8位二進(jìn)制數(shù)就是11111111了,換算成十進(jìn)制就是255,所以0到255一共有256個(gè)數(shù),一個(gè)字節(jié)只能記錄256個(gè)數(shù),字節(jié)叫byte,所以字節(jié)率byte rate就用比特率除以8,比如每秒傳送1536000比特,那么比特率就是1536000bit/s,而字節(jié)率就是1536000/8=192000btye/s,所以當(dāng)然字節(jié)率也一樣是一個(gè)傳輸速率的單位。

模擬信號(hào),簡(jiǎn)單說就是用電信號(hào)去模擬出其他信號(hào)(比如聲波),它的幅度值隨時(shí)間連續(xù)變化。比如你打電話有一個(gè)聲波,那手機(jī)采集到聲波以后就用電信號(hào)模擬出聲音的波形,那如果手機(jī)直接將這個(gè)模擬信號(hào)傳輸?shù)叫』锇榈氖謾C(jī)上,那因?yàn)闀?huì)有各種各樣的干擾,那么到小伙伴的手機(jī)上的時(shí)候聲音的波形就變了樣,如圖1.01,最后紅色的波形就變樣了

圖1.01

這樣小伙伴聽到的聲音就失真了。所以模擬信號(hào)的傳播就相當(dāng)于一直要照著前面的畫,那一個(gè)個(gè)的畫下去,越往后波形的變形就越嚴(yán)重,所以模擬信號(hào)在傳輸?shù)倪^程中抗干擾性比較差。所以在傳輸之前,需要將模擬信號(hào)轉(zhuǎn)為數(shù)字信號(hào)(模數(shù)轉(zhuǎn)換),數(shù)字信號(hào)只有兩種波形,一種是高的一種是低的,高就是1低就是0,比如圖1.02

圖1.02

數(shù)字信號(hào)的抗干擾能力比較好,數(shù)字信號(hào)只有兩種狀態(tài),所以可以輕松地還原出原來的數(shù)據(jù)。把模擬信號(hào)轉(zhuǎn)變?yōu)閿?shù)字信號(hào)首先就要對(duì)模擬信號(hào)采樣,假設(shè)每秒鐘采樣1次,如圖1.03

圖1.03

采樣以后就進(jìn)行量化,量化成一些等級(jí),如圖1.04


圖1.04

比如分了5個(gè)等級(jí),那Lv1就可以是001,Lv2就是010了(二進(jìn)制),Lv5就是101了,那么這樣編碼以后,就有圖1.05了

圖1.05

那么這樣的話在哪個(gè)時(shí)間是哪個(gè)等級(jí)就知道了,比如在3s時(shí)是100,也就是等級(jí)4(Lv4)。所以如果我們提高采樣率和量化等級(jí),形狀上當(dāng)然就會(huì)越來越接近這個(gè)曲線,也就能更好地還原出模擬信號(hào)

采樣率(sampling rate):聲音信號(hào)在”模數(shù)”轉(zhuǎn)換過程中單位時(shí)間內(nèi)采樣的次數(shù)。比如你每秒鐘采樣23333次,那么采樣率就是23333Hz(赫茲Hz是頻率的單位,指每秒鐘重復(fù)的次數(shù),如聲音是由振動(dòng)產(chǎn)生的,那100Hz就可以表示每秒振動(dòng)100次)。然后比如1kHz就等于1000Hz

人能聽到的聲波的頻率范圍是20Hz到20000Hz,那么由于采樣定理(采樣率必須至少是模擬信號(hào)頻率的兩倍),所以咱們的音頻的采樣率需高于20000*2=40000Hz,一般CD的標(biāo)準(zhǔn)是44100Hz的采樣率,也就是44.1kHz的采樣率。一般常見的采樣率就是44.1kHz或者48kHz。所以假設(shè)采樣率是Fs,那么原本信號(hào)的的頻率就不會(huì)超過Fs/2

在老外寫的Yutils里,有讀取音頻信息的函數(shù),首先你需要準(zhǔn)備一個(gè)音頻文件,格式需要是wav,那么如果你不是wav格式的就把它變?yōu)閣av格式的即可。然后只要把你音頻文件的路徑復(fù)制好,作為參數(shù)傳給_G.Yutils.decode.create_wav_reader函數(shù)即可獲得一個(gè)能提供音頻信息的表(表里有很多函數(shù),能提供音頻信息),如圖1.06

圖1.06

wav=_G.Yutils.decode.create_wav_reader('F:\\TEMP\\新建文件夾\\ヒーロー supercell.wav')? ?當(dāng)然函數(shù)返回的表賦值給了名叫wav的變量,那這個(gè)名字你也可以取xxx,比如xxx=_G.Yutils.decode.create_wav_reader('F:\\TEMP\\新建文件夾\\ヒーロー supercell.wav')然后函數(shù)的參數(shù)就是填的一個(gè)字符串,顯然現(xiàn)在的用的音頻就是叫ヒーロー supercell了。那么在有了函數(shù)返回的表以后,就可以獲取音頻信息了,比如利用表里的sample_rate函數(shù),就能知道你這個(gè)音頻的采樣率,如圖1.07

圖1.07

廢話,當(dāng)然是44100了,不然就是48000,因?yàn)閯倓傊v過采樣率一般就是44100Hz或48000Hz

然后表里的channels_number函數(shù),可以知道音頻有幾個(gè)聲道,如圖1.08

圖1.08

code行:xxx = _G.Yutils.decode.create_wav_reader('F:\\TEMP\\新建文件夾\\ヒーロー supercell.wav')

template行:!xxx.channels_number()!

顯然,channels_number()函數(shù)返回音頻通道的數(shù)量,常用的有單聲道和立體聲之分,反正這個(gè)函數(shù)最后得到的不是1就是2,其實(shí)這個(gè)函數(shù)沒啥用

然后,samples_per_channel函數(shù)返回每個(gè)聲道的采樣點(diǎn)個(gè)數(shù),如圖1.09

圖1.09

這個(gè)當(dāng)然不管是哪個(gè)聲道,它們的總的采樣點(diǎn)個(gè)數(shù)是一樣的,比如聲道1采樣點(diǎn)一共是13745711,那聲道2總共的采樣點(diǎn)數(shù)也是13745711

byte_rate函數(shù)返回音頻的字節(jié)率,這個(gè)概念剛剛講過。

所以可以看到現(xiàn)在的字節(jié)率(byte rate)是176400byte/s,那么就可以算出比特率,是176400*8即1411200bit/s,即1411.2kbit/s

bits_per_sample函數(shù)返回每個(gè)聲道的采樣精度,采樣精度決定了記錄聲音的動(dòng)態(tài)范圍,它以位(bit)為單位,比如8位、16位。8位可以把聲波分成256等級(jí)(2的8次方),16位可以把同樣的波分成65536等級(jí)(2的16次方)的信號(hào)??梢韵胂螅粩?shù)越高,聲音的保真度越高,因?yàn)楸环殖闪烁嗟牡燃?jí)。

當(dāng)然每個(gè)聲道的采樣精度都是一樣的,就像剛剛講的采樣個(gè)數(shù)一樣,各個(gè)通道都是一樣的。16位是常用的采樣精度。另外,函數(shù)名稱里的per當(dāng)然就是"每"的意思,如per second就是每秒,per week就是每周。那么其實(shí)知道了位深度(即采樣精度)、采樣率、通道數(shù),就可以知道它的傳輸速率了,44100*16*2=1411200bit/s,也就是剛剛上文中利用字節(jié)率算出的比特率,當(dāng)然是一樣的結(jié)果了,所以它每秒鐘傳輸1411200個(gè)bit

min_max_amplitude函數(shù),返回音頻可能的最小最大值,這個(gè)其實(shí)可以直接根據(jù)位深度(即采樣精度)算出來。比如位深就是剛剛的16bit,那么聲波被分為65535級(jí),那此時(shí)的最大值就是2^16/2-1=32767,最小值就是-2^16/2=-32768了,那么如果采樣精度是8bit就說明最大是127最小是-128

min_max_amplitude函數(shù)的作用是單位化幅度值,舉個(gè)例子,比如你在30000級(jí)那么如果采樣精度變成8bit的話,你在哪一級(jí)呢,30000/32768*128=117.1875,當(dāng)然因?yàn)?bit的精度比16bit低,所以當(dāng)然此時(shí)就不能保持117.1875級(jí)了,而是會(huì)取整。在單位化幅度值以后,得到的結(jié)果就會(huì)在-1到1之間了,比如30000/32768=0.91552734375就在-1到1之間,其實(shí)也很好理解,你知道30000級(jí)馬上要接近現(xiàn)在等級(jí)的最大值了,那么到底有多接近呢,30000/32768≈0.92馬上就到1了,振幅還是很大的

顯然因?yàn)檫@個(gè)音頻的采樣精度是16位,所以最小就是-32768

簡(jiǎn)單粗略地說,聲音的響度決定于聲源振動(dòng)的幅度(振幅),振幅越大,響度越大,分貝(dB)可以作為振幅的測(cè)量單位

音頻的時(shí)長(zhǎng)可以利用剛剛的函數(shù)得到,比如用samples_per_channel就知道了總的樣本數(shù),然后用sample_rate就知道了采樣速率,也就是知道了每秒鐘采樣的個(gè)數(shù),所以總共音頻有多少秒就可以算了,比如 “總樣本數(shù)/采樣率”,比如算出來音頻時(shí)長(zhǎng)是174.78秒

position函數(shù)用于設(shè)置樣本流的位置,相當(dāng)于定位的作用,所以這個(gè)函數(shù)是需要用的。先簡(jiǎn)單地理解一下,咱們做頻譜效果,那個(gè)頻譜是動(dòng)的嘛,比如逐幀,那么每一幀都會(huì)有一個(gè)頻譜圖,那你就需要獲取相應(yīng)時(shí)間的一些樣本,假設(shè)采樣率是48000Hz、音頻時(shí)長(zhǎng)是10秒,那么總的采樣數(shù)就是480000了,這時(shí)用position函數(shù)定位,函數(shù)的參數(shù)范圍是0到4800000,此時(shí)假設(shè)1秒有30幀,那么音頻一幀的采樣數(shù)就是48000/30=1600,那么照理說在第0幀的時(shí)候你就可以采樣1600次,然后下一次采樣你就可以用函數(shù)position(1600)定位在這里,然后再取樣1600次就完成了第一幀到第二幀的采樣了,然后又定位在3200,所以實(shí)際上,當(dāng)你用position函數(shù)定位的時(shí)候,你采樣數(shù)可以自己設(shè)定,但是采樣數(shù)是有上限的,比如現(xiàn)在本身音頻的總的采樣數(shù)是480000,那么你就算定位在0處(即position(0)),此時(shí)你采樣也不能采666666666次,因?yàn)楸旧碜疃嗑椭挥?80000個(gè)樣本,但是你可以采樣比如2048次。position函數(shù)可以說是一定要用的,因?yàn)樵蹅円约翰蓸泳鸵欢ㄒㄎ?/strong>,不然怎么知道你要在音頻的什么位置開始采樣。

samples函數(shù),用來采樣,參數(shù)填你要采樣的個(gè)數(shù),配合position函數(shù)使用,先用position函數(shù)定位,然后再用samples函數(shù)在這個(gè)位置往后采樣n次,如圖1.10

圖1.10

先用position函數(shù)定位音頻在第80000個(gè)樣本處,然后用samples函數(shù)從這里開始往后采樣2048個(gè)樣本,然后1表示采樣是采樣的第一個(gè)通道,而如果你想采樣第二個(gè)聲道,那就可以用2,即圖1.11這樣

圖1.11

還有就是你設(shè)定的采樣個(gè)數(shù)就算超出了音頻總的采樣數(shù),采樣也不會(huì)多出來,比如音頻本身總的采樣數(shù)是20000,然后你position定位在18000,即position(18000),然后你用samples函數(shù)采樣2048個(gè),實(shí)際上最后函數(shù)返回的采樣出來的表里只會(huì)有2000個(gè)樣本,不會(huì)有2048個(gè)。

利用samples函數(shù)采樣以后就得到了你那些采樣點(diǎn)的等級(jí),比如上圖第一個(gè)的等級(jí)是4937,那么因?yàn)楝F(xiàn)在等級(jí)絕對(duì)值最大是32768,那么單位化振幅以后就是4937/32768≈0.15067,所以此時(shí)的振幅比較小


? ? ? ? 因?yàn)橐鲆纛l頻譜需要用FFT(快速傅里葉變換),那么下面開始慢慢講這一部分的東西

聲波的振幅是隨時(shí)間變化的,所以自變量是時(shí)間(即橫軸是時(shí)間),那么聲音信號(hào)就是時(shí)域信號(hào)?,F(xiàn)在看一個(gè)正弦函數(shù)f(x)=sinx

它的橫坐標(biāo)是時(shí)間、縱坐標(biāo)是幅度,這就是一個(gè)時(shí)域信號(hào)函數(shù)

y=sinx的頻率f是1/T,函數(shù)周期是2π,所以頻率f=1/T=2π分之一。那么現(xiàn)在假設(shè)橫軸是頻率,縱軸是幅度,顯然y=sinx只有一個(gè)固定頻率2π分之一,那么這個(gè)函數(shù)在頻域中的圖像就是圖1.12這樣的(2π分之一大約是0.1591549430919)

圖1.12

所以原本是橫軸是時(shí)間的時(shí)域信號(hào)函數(shù)就變?yōu)榱藱M軸是頻率的頻域信號(hào)

對(duì)于一般的正弦函數(shù)y=Asin(2πfx+φ),它其中的f就是頻率,φ就是初始相位,A是振幅,如果上圖中的旋轉(zhuǎn)臂轉(zhuǎn)得越快,那么頻率就越高,在零時(shí)刻旋轉(zhuǎn)臂和水平方向的夾角就是初始相位φ,另外這其中的2πf被成為角速度(或角頻率),所以一般的正弦函數(shù)也可以寫成y=Asin(ωx+φ),當(dāng)然其中ω就是角頻率。還有就是函數(shù)的周期T為1/f當(dāng)然也是2π/ω了

為什么會(huì)有時(shí)域和頻域的概念呢?比如有圖1.13這么個(gè)音頻的波形圖

圖1.13

比如截了這一小段時(shí)間的波形圖,橫軸是時(shí)間、縱軸是幅值(范圍-1到1)。假設(shè)想讓音量大一些,應(yīng)該怎么做呢?因?yàn)樯厦娴牟ㄐ螆D的振幅對(duì)應(yīng)的其實(shí)就是聲音的強(qiáng)度,如果想讓音量大一些,只需要將整體的振幅同比例擴(kuò)大即可。這個(gè)需求很容易滿足。但如果你喜歡低音效果,你想加強(qiáng)上面這段音樂的低音部分,更加厚重一些,那應(yīng)該怎么做呢?要知道時(shí)域的圖像看起來雜亂無章,想找到低音部分根本無從下手,跟不用說將低音部分加強(qiáng)了。因?yàn)?strong>高中低音在時(shí)域中是雜糅在一起的,沒法便利地將他們剝離開來,隨便改動(dòng)波形圖中的一小部分,都會(huì)同時(shí)影響到高中低音。所以如果僅僅對(duì)時(shí)域信號(hào)進(jìn)行處理是無法完成這個(gè)需求的。

在1807年傅里葉提出了:任何連續(xù)的周期信號(hào)都可以由一組正弦曲線組合而成(即傅里葉級(jí)數(shù))。比如有一個(gè)方波

那么用很多個(gè)正弦曲線組合在一起就能得到一個(gè)近似的方波

圖1.14

可以看到,一開始第一行是sint,然后在此基礎(chǔ)上加上1/3sin3t就得到了第二行,即第二行的圖像就是sint+1/3sin3t的圖像。然后又加上1/5sin5t得到了第三行,然后第四行當(dāng)然就是函數(shù)f(t)=sint+1/3sin3t+1/5sin5t+1/7sin7t的圖像了,顯然越來越接近方波了,而最后一行可以看到隨著組合的正弦曲線越來越多,圖像就越來越接近方波。那么就可以把時(shí)域的方波信號(hào)變成頻域信號(hào),如圖1.15

第一列是分解出來的正弦波,第二列是表示這些個(gè)波要疊加起來,第三列是疊加起來后的圖像,第四列是頻域圖像,橫軸是頻率f縱軸是振幅(就像剛剛講的sinx的頻域圖像一樣。頻域的一個(gè)個(gè)橫坐標(biāo)是時(shí)域信號(hào)分解后得到的一個(gè)個(gè)正弦波的頻率,縱坐標(biāo)是各個(gè)頻率的正弦波的振幅)
圖1.15

當(dāng)然從左到右橫坐標(biāo)(頻率)逐漸變大,然后縱坐標(biāo)就是每個(gè)頻率對(duì)應(yīng)的振幅了,所以這樣就知道這個(gè)方波它頻率低的部分振幅大,頻率高的振幅小。關(guān)于從時(shí)域到頻域,圖1.16應(yīng)該能更直觀的感受

圖1.16

原本紅色的時(shí)域信號(hào),能分解成很多個(gè)正弦曲線,將這些正弦曲線按照頻率從小到大來排列,然后每個(gè)頻率的正弦曲線的幅度給一個(gè)個(gè)記錄下來,就得到了頻域圖像,也就是一個(gè)頻譜。那么現(xiàn)在這個(gè)頻譜是橫坐標(biāo)是頻率、縱坐標(biāo)是該頻率對(duì)應(yīng)的幅度值,這樣的頻譜叫做振幅譜。那既然信號(hào)可以分解為正弦函數(shù)的和,那么就知道了這個(gè)信號(hào)是由哪些頻率的正弦波構(gòu)成,也知道了對(duì)應(yīng)頻率的波在信號(hào)中的幅度信息和相位信息。信號(hào)可以被分解,那其實(shí)分解以后也還可以重新組合回去,所以這個(gè)過程是可逆的,那么意味著沒有信息的丟失,所以在分解以后,不僅是知道了各個(gè)頻率對(duì)應(yīng)的幅度、還知道了各個(gè)頻率對(duì)應(yīng)的相位,因?yàn)槟惴纸獬鰜淼倪@些正弦波也是有它們各自的相位的,相位不一樣那組合的最終結(jié)果當(dāng)然就可能不一樣,所以除了橫軸是頻率縱軸是幅值的幅度譜,還有橫軸是頻率縱軸是相位的相位譜,這樣,一個(gè)波形圖就可以變成頻譜圖(幅度譜和相位譜)了,有了頻譜(振幅譜和相位譜)同樣也就可以還原出波形圖了。有了頻譜以后,比如就可以進(jìn)行濾波,比如有些高頻的噪音就可以直接去掉,而如果沒有把信號(hào)從時(shí)域變到頻域就沒辦法想去除高頻就去除高頻。

那么我們一般的信號(hào)都不是周期信號(hào),連續(xù)周期信號(hào)可以展開成傅里葉級(jí)數(shù)(一堆正弦波),那非周期信號(hào)呢?那就是傅里葉變換了,用來將非周期的時(shí)域信號(hào)變?yōu)轭l域信號(hào)。傅里葉這孩子的名字開頭是F,所以用大寫的F來表示傅里葉變換,變換后的自變量是頻率(橫坐標(biāo)是頻率),如圖1.17

圖1.17

其中自變量是角頻率ω,那么算出來的F(ω)就是一個(gè)復(fù)數(shù),當(dāng)然剛剛也說了時(shí)域到頻域的變換是可逆的,所以時(shí)域變到頻域以后不會(huì)丟失信息,所以你在角頻率ω時(shí)就一定能知道此時(shí)的振幅和相位,所以F(ω)這個(gè)復(fù)數(shù)就一定能提供幅度信息和相位信息,那么角頻率ω對(duì)應(yīng)的幅度是多少呢,就是F(ω)這個(gè)復(fù)數(shù)的模(這個(gè)大家應(yīng)該都知道,說直接一點(diǎn),假設(shè)這個(gè)復(fù)數(shù)F(ω)的實(shí)部是an虛部是bn,那么它的模就是√(an2+bn2)),頻率ω對(duì)應(yīng)的相位就是這個(gè)復(fù)數(shù)F(ω)的主輻角(簡(jiǎn)單來說就是該復(fù)數(shù)在復(fù)平面上所對(duì)應(yīng)的點(diǎn)與原點(diǎn)的連線和x軸正半軸之間形成的角度,取值范圍當(dāng)然是0到2π了)。那么這樣你就可以有幅度譜和相位譜了,因?yàn)樵诮穷l率是ω時(shí),你可以算出F(ω),而F(ω)這個(gè)復(fù)數(shù)又能得到振幅值和相位值。這樣時(shí)域信號(hào)f(t)就可以變?yōu)轭l域信號(hào)了,而如果是頻域信號(hào)變?yōu)闀r(shí)域信號(hào)的話就是傅里葉逆變換了

逆變換回去就得到了時(shí)域信號(hào)f(t)

OK,既然連續(xù)的非周期信號(hào)可以連續(xù)傅里葉變換了,那你看啊,咱們不是數(shù)字信號(hào)嗎,這你瞧瞧不是采樣的嗎,不是離散的嗎,不是不是連續(xù)的嗎,那現(xiàn)在就不是要連續(xù)傅里葉變換了,而是要用散傅里葉變換,那離散傅里葉當(dāng)然就不是積分了而是累加,如圖1.18,假設(shè)總共采樣了N個(gè)點(diǎn),那么離散傅里葉變換以后就知道第n個(gè)頻率(頻率大小是2πn/N)所對(duì)應(yīng)的振幅(即F(n)這個(gè)復(fù)數(shù)的模)了

圖1.18

那這里的e的次方可以用歐拉公式來算

歐拉公式

這樣,原本你要算的e的-i2πnt/N次方,就可以更舒服的計(jì)算了。這樣可以方便地算出F(n)的實(shí)部和虛部了。比如現(xiàn)在采樣了4個(gè)點(diǎn)(即N=4),那么比如求F(2)就是圖1.19這樣的了

圖1.19

也就是從t=0開始累加,一直加到t=3(即N-1,即4-1=3),然后其中n=2、N=4。所以,同樣的道理,離散傅里葉變換以后就可以得到F(0)、F(1)、F(2)、F(3)了(總共4個(gè)采樣點(diǎn),第0個(gè)點(diǎn)到第3個(gè)點(diǎn))。因?yàn)橛袣W拉公式,那比如F(2)的實(shí)部就可以這么算了:

同樣F(2)的虛部也用上歐拉公式計(jì)算即可。所以,比如你就可以寫一個(gè)離散傅里葉變換的函數(shù)

因?yàn)長(zhǎng)ua的table下標(biāo)是從1開始的,所以這里的t就該是t-1,當(dāng)然n也就該是n-1,然后這樣離散傅里葉變換以后,第0個(gè)點(diǎn)的結(jié)果就是F[1]了(Lua下標(biāo)從1開始),那么F[1]這個(gè)復(fù)數(shù)的實(shí)部就是F[1].real,虛部就是F[1].i了。

我們將離散傅里葉變換簡(jiǎn)稱為DFT(即Discrete Fourier Transform),那傅里葉變換當(dāng)然簡(jiǎn)稱FT(即Fourier Transform)了。對(duì)于N個(gè)點(diǎn)的離散傅里葉變換,把N稱為DFT的區(qū)間長(zhǎng)度

可以看到,隨著采樣點(diǎn)N的增加,DFT的用時(shí)就會(huì)變得很長(zhǎng),因?yàn)橐愫芏嗉臃ǔ朔?,所以?965年有兩個(gè)外國(guó)人寫了一個(gè)DFT的優(yōu)化算法,這個(gè)優(yōu)化的快速算法僅僅是讓代碼執(zhí)行速度更快,其他原理什么的并沒有變化,這個(gè)優(yōu)化算法稱為快速傅里葉變換,簡(jiǎn)稱FFT(即Fast Fourier Transform)。比如采樣了N個(gè)點(diǎn),直接對(duì)N個(gè)點(diǎn)進(jìn)行DFT執(zhí)行速度很慢,所以就把N個(gè)點(diǎn)分成一個(gè)奇序列(odd)和一個(gè)偶序列(even),然后這樣就拆成了兩個(gè)N/2個(gè)點(diǎn)的DFT計(jì)算了,然后奇序列和偶序列又可以繼續(xù)分成奇序列偶序列,一直這樣下去分,直到分到序列里只有2個(gè)點(diǎn)為止,這樣對(duì)兩個(gè)點(diǎn)做DFT計(jì)算就很快了,這樣原本N個(gè)點(diǎn)的DFT就變成了很多只有兩個(gè)點(diǎn)的DFT,代碼執(zhí)行速度就快多了

分治思想(將復(fù)雜的問題分成很多相似的子問題)

那么當(dāng)然,因?yàn)橐@么一直分一直分,所以快速傅里葉變換就要求采樣數(shù)N需要是2的次方,因?yàn)楸热缰话袾分一次、分成奇序列和偶序列,那么N就必須被2整除,所以要能一直分下去分到最后每個(gè)序列只有2個(gè)離散點(diǎn)的話,采樣點(diǎn)數(shù)N就需要是2的次方(比如2的11次方之類的)。那其實(shí)在Yutils里本身就寫的有FFT代碼,所以就算你不太會(huì)寫,也壓根不用擔(dān)心,知道這些原理就行了

用ctrl+F直接在Yutils搜索即可看到這段代碼

那么FFT以后我們就知道各個(gè)頻率從小到大的點(diǎn)所對(duì)應(yīng)的振幅和相位是多少了,咱們做效果不太需要相位,所以只用振幅信息來做振幅譜就行了。假設(shè)采樣率是Fs,那么N個(gè)從小到大的頻率就是把Fs/2給分成N等份而已(上文說了采樣率Fs是原始信號(hào)頻率的2倍)。另外,這里提一句,由于共軛對(duì)稱性,N個(gè)點(diǎn)最后會(huì)舍去一半,保留N/2個(gè)點(diǎn),所以比如你采樣2048個(gè)點(diǎn),那么最后會(huì)保留前面N/2個(gè)頻率的所對(duì)應(yīng)的振幅(和相位)信息。

好了好了,現(xiàn)在咱們想要的振幅有了吧,再捋一捋,首先你自己采樣N個(gè)點(diǎn)(養(yǎng)成好習(xí)慣的話,就像剛剛說的,N就要是2的次方),就得到原本信號(hào)上N個(gè)時(shí)刻的幅度值,然后有了這N個(gè)幅值,用FFT得到從小到大的各個(gè)頻率所對(duì)應(yīng)的幅值(稱為頻率分量),然后將這些從小到大的頻率作為橫坐標(biāo),它們對(duì)應(yīng)的幅值(即頻率分量)作為縱坐標(biāo),這不就得到了咱們一開始講的振幅譜了嗎?

還沒完,你可能會(huì)問,頻譜不是和時(shí)間沒有關(guān)系嗎,時(shí)域變到頻域以后,橫軸是頻率縱軸是幅度(或者相位等),頻譜和時(shí)間沒關(guān)系那么為什么你看到的頻譜圖是動(dòng)態(tài)的呢?非常好,如果你不這么問,那你豈不是文章前面的內(nèi)容沒看懂?確實(shí),頻譜是和時(shí)間沒有關(guān)系的,比如有個(gè)時(shí)域信號(hào)持續(xù)50s,那么你可以取0到50s的這整段信號(hào),來做FFT,得到一個(gè)頻譜,這個(gè)頻譜圖就是靜止的,不會(huì)隨時(shí)間變化,不管你是0到50s的哪一時(shí)刻,頻譜圖都不變都還是那個(gè)頻譜圖,那為什么特效做的頻譜是動(dòng)態(tài)的呢?其實(shí)因?yàn)镕T(傅里葉變換)有局限性:頻譜中沒有時(shí)間信息,所以不同時(shí)域信號(hào)的頻譜沒啥區(qū)別,它就無法有效地反映信號(hào)在窄區(qū)間上的突變,傅里葉變換對(duì)頻譜的描繪是“全局性”的,不能反映時(shí)間維度局部區(qū)域上的特征,人們雖然從傅立葉變換能清楚地看到一整段信號(hào)包含的每一個(gè)頻率的分量值,但很難看出對(duì)應(yīng)于頻率域成分的不同時(shí)間信號(hào)的持續(xù)時(shí)間和發(fā)射的持續(xù)時(shí)間,F(xiàn)T在平穩(wěn)信號(hào)的分析和處理中有著突出貢獻(xiàn)的原因在于,人們利用它可以把復(fù)雜的時(shí)間信號(hào)變換到頻率域中,然后用相對(duì)簡(jiǎn)單的頻譜特性去分析和發(fā)現(xiàn)原信號(hào)的特性,但是一般,咱們的音頻都不是平穩(wěn)信號(hào),基本上都是非平穩(wěn)信號(hào),所以為了將時(shí)域和頻域相聯(lián)系,就要用到短時(shí)傅里葉變換,也簡(jiǎn)稱STFT(即Short-Time Fourier Transform),它將信號(hào)的時(shí)域和頻域聯(lián)系起來,我們可以據(jù)此對(duì)信號(hào)進(jìn)行時(shí)頻分析。那么怎么STFT呢,那就是局部平穩(wěn)化:把長(zhǎng)時(shí)間的非平穩(wěn)信號(hào)看成是一系列短時(shí)平穩(wěn)信號(hào)的疊加,然后再對(duì)這些一個(gè)個(gè)短時(shí)間的信號(hào)做FFT即可。如圖1.20

圖1.20

假設(shè)圖1.20第一行是一個(gè)有50s的信號(hào),現(xiàn)在不整個(gè)對(duì)0到50s做FFT,而是將這些信號(hào)分幀,"切成"一段段小的信號(hào),對(duì)這些一段段小的信號(hào)做FFT,一般情況下按經(jīng)驗(yàn)認(rèn)為,20-40ms內(nèi)的語音幀可近似看做平穩(wěn)信號(hào),這樣對(duì)短時(shí)間內(nèi)的信號(hào)做FFT得到一小段時(shí)間里的頻譜圖,就讓頻譜和時(shí)間聯(lián)系上了。(要是對(duì)"全局時(shí)間"做FFT就只能得到一張頻譜圖,如圖1.21)

圖1.21

所以現(xiàn)在大家知道了為什么要用position函數(shù)了吧,因?yàn)榧僭O(shè)音頻總共的采樣數(shù)是194560個(gè),那這個(gè)樣本數(shù)是你整個(gè)音頻時(shí)間里的樣本數(shù),可是咱們要做的是STFT,所以需要用position函數(shù)定位,然后音頻定位在指定位置以后才能用samples函數(shù)獲取position位置后的n個(gè)樣本,然后獲得了樣本以后用min_max_amplitude函數(shù)單位化幅度值,這樣你就有了這n個(gè)樣本所對(duì)應(yīng)的各個(gè)幅值了(也就是有了f(n)),那么就可以FFT得到F(n)了,然后求出F(n)的模|F(n)|就可以做幅度譜了。所以此時(shí)你就知道position函數(shù)定位以后用samples函數(shù)取樣不是取的越多越好,因?yàn)樵蹅冎恍枰∫粠瑫r(shí)間內(nèi)的樣本,根據(jù)剛剛前文說的一般語音幀,20-40ms、音頻采樣率一般44.1kHz、采樣數(shù)要是2的次方,所以綜合下來,咱們一般采樣數(shù)就是1024或者2048,因?yàn)椴蓸勇适?4100Hz,那么意味著每ms采樣44.1個(gè),那比如40ms就采樣了1764、20ms就采樣了882個(gè),然后采樣數(shù)是2的次方,所以一般就取1024或2048。position函數(shù)的定位就根據(jù)幀持續(xù)時(shí)間和采樣率得到了,比如你要在第2333幀到第2334幀采樣,那么position的定位值就該是math.round(2333*fdur*Fs*0.001),即position(math.round(2333*fdur*Fs*0.001)),其中fdur是一幀持續(xù)時(shí)間、Fs是采樣率,由于采樣率是每秒采樣數(shù),而fdur單位是ms,所以要統(tǒng)一單位,將采樣率變成每毫秒的采樣數(shù),也就是Fs*0.001,然后這個(gè)定位當(dāng)然是定位在第幾個(gè)樣本處,所以肯定是整數(shù),所以要math.round一下,到第2333幀時(shí),已經(jīng)采樣了math.round(2333*fdur*Fs*0.001)個(gè)點(diǎn),要在第2333幀到第2334幀采樣,那么開始采樣的位置就是math.round(2333*fdur*Fs*0.001)了,然后再用samples函數(shù)取樣2048個(gè)即可。

好了,采了樣,也把采樣的樣本都幅度值單位化了,這樣就可以FFT了,因?yàn)閅utils里有相應(yīng)的函數(shù),所以就可以直接用,使用_G.Yutils.decode.create_frequency_analyzer函數(shù)進(jìn)行樣本解析,該函數(shù)輸入兩個(gè)參數(shù),第一個(gè)是你的樣本(裝有一堆[-1,1]的幅度值的table),第二個(gè)參數(shù)是填你的音頻采樣率,這個(gè)函數(shù)同樣也是返回一個(gè)表,這個(gè)表里有很多函數(shù),你可以利用這些函數(shù)做頻譜效果,不過Yutils本身沒有把各個(gè)頻率的幅值給保留下來,所以為了做振幅譜,你可以改一下Yutils里的代碼,

可以看到把data這些樣本給FFT了,然后又只保留了每個(gè)復(fù)數(shù)的模,所以在用了其中的magnitude函數(shù)取模以后,data就是只剩下幅度信息了,可是Yutils原本沒有在frequencies表里加入幅度信息,所以你需要在里面加入amp振幅信息,各個(gè)data[i]就是振幅,所以就amp=data[i]即可。這樣就有了N/2個(gè)頻率對(duì)應(yīng)的振幅了,但是我們要做頻譜圖,并不需要N/2這么多個(gè)頻率,你想,咱們采樣數(shù)N一般是2048,那么橫坐標(biāo)你全部擺出來不就有1024個(gè)了嗎,那你要看1024個(gè)條形塊嗎,對(duì)吧,咱們做頻譜,一般也就幾條而已,比如下圖

你要是有1024個(gè),那每一條豈不是非常細(xì)、非常窄了?而且也不好看。所以我們要計(jì)算某個(gè)頻率區(qū)間范圍內(nèi)的平均幅度值,比如你這1024個(gè)頻率中第2個(gè)頻率是23,它所對(duì)應(yīng)的振幅是31,然后第3個(gè)頻率是46,它所對(duì)應(yīng)的振幅是54,第4個(gè)頻率是70,它所對(duì)應(yīng)的振幅是11,那么假設(shè)你現(xiàn)在要用一個(gè)條形塊表示20Hz到70Hz的幅度情況,那么你就可以把這之間的3個(gè)振幅加起來,然后除以3平均一下,即(31+54+11)/3=32,所以你就可以設(shè)定頻率在20Hz到70Hz之間時(shí),用僅僅一個(gè)條形塊來表現(xiàn)振幅情況,比如設(shè)定該條形塊的高度是32(即(31+54+11)/3),所以這么看來,咱們現(xiàn)在的任務(wù)就是選擇橫坐標(biāo)(頻率)以及對(duì)應(yīng)的頻率分量(即振幅)了,那既然現(xiàn)在我們使用的條形塊數(shù)量會(huì)較少,那么就意味著展現(xiàn)的頻譜圖就沒有那么細(xì)節(jié)而是更加"平均"了,所以想一想人能聽到的范圍是20Hz到20000Hz,如果你要用30個(gè)條形塊的話,你會(huì)選擇橫坐標(biāo)(頻率)的范圍就是20到20000嗎,我們知道音頻一般低頻部分比較多,高頻部分就幾乎沒有,假設(shè)你就選擇橫坐標(biāo)的范圍是20到20000,那總共30塊,那20Hz到2018Hz只用3塊條形就表示完了,剩下的27塊就表示2018到20000的高頻部分了,然而音頻本來就沒啥高頻部分啊,你看著27塊幾乎沒啥變化的條形塊你開心嗎,對(duì)吧?(20000-20=19980,分成30塊,每一塊的的頻率跨度就有19980/30=666Hz,這樣第一塊條形是20Hz到686Hz,這樣就只用了一個(gè)條形塊就概括了20Hz到686Hz這么大長(zhǎng)度的頻率區(qū)間的平均振幅,那豈不是丟掉了很多細(xì)節(jié)信息,你就不知道20Hz到686Hz之間的比如50Hz到200Hz的平均振幅是什么樣的,同樣的,第二個(gè)條形塊就是686Hz到1352Hz,第三個(gè)條形塊就是1352Hz到2018Hz的平均幅度情況,這樣,只用3個(gè)條形塊就籠統(tǒng)地概括了20Hz到2018Hz的幅度值大概情況,可是啊,一般的音頻明明低頻部分的振幅大,高頻部分就沒啥幅度,結(jié)果你用3條就表示了20到2018,用剩下27條去表示頻率高的部分的幅度情況??那這頻譜還看個(gè)水煮牛肉???)? 所以由于一般音頻本身就是低頻部分的振幅較大,所以高頻部分咱們根本也不需要太在乎,所以回到剛剛說的橫坐標(biāo)的選取,橫坐標(biāo)的范圍就不要選擇20到20000,而是選擇20Hz到2000Hz,這個(gè)也是AE(After Effect)的默認(rèn)數(shù)值。也就是說,咱們現(xiàn)在忽略高頻部分,只關(guān)注低頻部分,我們用比如30個(gè)條形塊來表示20Hz到2000Hz的相應(yīng)的振幅情況這樣就可以看到更多頻率較低的部分的振幅情況了。那么(2000-20)/30=66,這樣每一條跨度是66Hz,那第一個(gè)條形塊就表示20Hz到86Hz的平均振幅了,第二個(gè)條形塊就表示86Hz到152Hz的平均振幅了,這么下去,低頻部分的細(xì)節(jié)就展現(xiàn)的很清楚了,就不會(huì)把很大一個(gè)范圍的給用一個(gè)條形塊籠統(tǒng)地平均地概括了。那么還有一個(gè)方法,如果你非要選擇橫坐標(biāo)的范圍是20到20000,那么你可以讓每一個(gè)條形塊表示的區(qū)間跨度不一樣,也就是橫坐標(biāo)不是均勻分布的,比如你可以第一條表示20Hz到50Hz,第二條表示50到100,第三條表示100到180,第四條表示180到280,第五條表示280到400,以此類推這么下去,然后高頻部分因?yàn)闆]啥振幅,所以你就籠統(tǒng)地表示高頻部分即可,比如讓第29條表示5000到8000,最后第30條表示8000到20000,這樣的話,你也可以展現(xiàn)足夠的低頻部分的細(xì)節(jié)、省略掉沒啥東西的高頻部分,那你說怎么不均勻的選擇橫坐標(biāo)呢,這個(gè)很簡(jiǎn)單很靈活,比如你可以用上指數(shù)函數(shù),那樣不就可以讓你的第n個(gè)橫坐標(biāo)和第n-1個(gè)橫坐標(biāo)的差距越來越大了。當(dāng)然,我自己是喜歡直接將橫坐標(biāo)的范圍設(shè)定為20到2000的,高于2000Hz的頻率一般就直接忽略掉。

選擇好了橫坐標(biāo)就該算幅度了,幅度就像剛剛說的,就是算個(gè)平均值就行了。假設(shè)你FFT以后得到了1024個(gè)頻率以及其對(duì)應(yīng)的振幅(即FFT的結(jié)果取模,因?yàn)镕FT的結(jié)果是復(fù)數(shù),包含振幅和相位信息,剛剛已經(jīng)說過多遍),那比如你要算20Hz到80Hz的平均幅度,那么就遍歷這1024個(gè)頻率,看哪些頻率在20Hz到80Hz的,把這些頻率對(duì)應(yīng)的振幅加起來,如果一共加了cnt次,那么當(dāng)然要平均振幅的話,加起來的這個(gè)振幅除以cnt就得到了20Hz到80Hz所對(duì)應(yīng)的平均振幅了。不過這樣算平均振幅的函數(shù)在Yutils里也是沒有的,所以你可以自己在Yutils里添加這么一個(gè)函數(shù)

就添加在frequency_range_weight函數(shù)后面即可。如果不會(huì)的話可以看文章下面的下載鏈接。顯然這個(gè)函數(shù)就能計(jì)算freq_min,?freq_max這個(gè)范圍的平均幅度值了。那么有了橫坐標(biāo)和縱坐標(biāo)不就已經(jīng)"完成"了頻譜圖了嗎,也就是現(xiàn)在把20Hz到2000Hz分成比如30份,然后每一份的對(duì)應(yīng)的平均幅度也有了,那這樣不就得到了振幅譜了嗎?

然后還有一些要注意的點(diǎn),比如我們要人為設(shè)定最大幅度,比如你做頻譜效果,你不希望這些條形塊的高度超過300,那么你就要設(shè)定最大幅度為300。怎么設(shè)定呢,就是你得到每一幀的頻譜圖以后,你再遍歷所有幀、找到這所有頻譜圖里幅度最大的數(shù)值是多少,然后算這個(gè)最大值和300的比例,然后就把這個(gè)最大的幅度給縮放成300,然后當(dāng)然,其他所有幀的頻譜圖的所有條形塊都以這同樣的比例來縮放一下,這樣,我們就控制了整個(gè)頻譜效果的最大高度了,你就可以自由的設(shè)定條形塊的高度了,比如你想它高一點(diǎn),那么就設(shè)定最大高度是400或666等等等等的。

第二個(gè)需要注意的點(diǎn)是,有的時(shí)候一些條形塊的振幅很小、高度很小,可能看起來高度低的和高度高的相比差距很大,那么你可以人為設(shè)定讓條形塊之間的高度差距小一點(diǎn),那么怎么做呢,你可以給每個(gè)條形塊的高度加一個(gè)指數(shù),設(shè)定0到1之間的一個(gè)指數(shù),就能縮小高度差,比如25和9本身的差距是16,但是你加個(gè)指數(shù),25^0.5和9^0.5,就變成了5和3,這樣兩個(gè)數(shù)的差距就變小了,當(dāng)然你加的指數(shù)越接近0得到的兩個(gè)數(shù)差距就越小,你的指數(shù)越接近1,計(jì)算后兩數(shù)差距就越接近原來兩數(shù)的差距。

還有就是,除了振幅譜,你也可以做比如能量譜功率譜,能量譜當(dāng)然橫坐標(biāo)是頻率縱坐標(biāo)就是能量了,那么能量怎么算呢,就是振幅的平方即可,也就是說你FFT得到的復(fù)數(shù)的模不就是振幅嗎,那你這個(gè)復(fù)數(shù)的模的平方就是能量了,所以能量也是直接就這么算出來即可。那么功率呢,功率就是能量除以區(qū)間長(zhǎng)度嘛,剛剛講過采樣數(shù)N稱為DFT的區(qū)間長(zhǎng)度,所以功率也是直接就能算出來的,就是用你的振幅平方一下,然后再除以N即可。當(dāng)然如果算功率譜,最后也要將條形塊之間的高度差給弄小一點(diǎn)。為什么要功率譜呢,因?yàn)楣β首V不受頻率分辨率的影響(剛剛沒有講頻率分辨率,簡(jiǎn)單地說下,STFT不是分幀做FFT嗎,那截取信號(hào)的時(shí)間越長(zhǎng),則時(shí)間分辨率越低,頻率分辨率越高;截取信號(hào)越短,時(shí)間分辨率越高,頻率分辨率越低),所以功率譜不受頻率分辨率的影響的話,功率譜就有它的意義。不過,對(duì)于做特效來說,直接用振幅譜就可以了,因?yàn)樽龉β首V的計(jì)算量會(huì)大不少,而且效果上看起來也沒多少區(qū)別。功率譜計(jì)算量更大是因?yàn)?strong>要平方然后除以區(qū)間長(zhǎng)度,比如本來算得了1024個(gè)振幅就可以做振幅譜了,但是做功率譜的話,還需要把這1024個(gè)數(shù)每一個(gè)都平方再除以N(區(qū)間長(zhǎng)度),然后得到了條形塊高度后也還要縮小條形塊之間的高度差,所以計(jì)算量肯定更大,但是特效上又沒多少區(qū)別,所以就可以選擇做振幅譜即可。

再多講下_G.Yutils.decode.create_frequency_analyzer函數(shù),參數(shù)剛剛說了輸入樣本和音頻采樣率,比如你取了2048個(gè)點(diǎn),然后將每個(gè)點(diǎn)對(duì)應(yīng)的振幅都單位化、使幅度在[-1,1]后,就可以把這個(gè)裝有2048個(gè)幅度值的表作為第一個(gè)參數(shù),然后音頻采樣率當(dāng)然不用多說。然后這個(gè)函數(shù)會(huì)返回一個(gè)表,這個(gè)表里裝有很多函數(shù),比如你設(shè)定變量xxx=_G.Yutils.decode.create_frequency_analyzer(samples, 48000),那么xxx就是一個(gè)表了,表里的frequencies函數(shù)能提供N/2個(gè)頻率以及其對(duì)應(yīng)的振幅(因?yàn)椴蓸訑?shù)是N在FFT以后就去掉了一半,剛剛說過,然后振幅信息是剛剛說的你需要自己在Yutils里加的),所以此時(shí)你用tbl=xxx.frequencies()就可以獲得這些信息了,這樣比如tbl[3].freq就是第三個(gè)頻率了,然后tbl[3].amp就是第三個(gè)頻率對(duì)應(yīng)的振幅了,這些其實(shí)大家自己看Yutils的代碼應(yīng)該很清楚

然后也說了,現(xiàn)在咱們自己加了frequency_range_amp函數(shù),代碼在上文里也有,那么添加了這個(gè)函數(shù)以后就可以用來求某個(gè)頻率范圍內(nèi)的平均振幅了,所以你就可以用在xxx表里的frequency_range_amp函數(shù)了,即現(xiàn)在是xxx.frequency_range_amp,它返回的就是一個(gè)數(shù)字,就是你[freq_min,?freq_max]這個(gè)范圍對(duì)應(yīng)的平均幅值了。

????????然后現(xiàn)在就是看看頻譜可以做哪些花樣了。首先,直接條形塊排成一行或者一列是可以的,那么比如一行可以每個(gè)條形塊設(shè)定不同的顏色等等、然后條形塊的定位點(diǎn)不一樣的話,"縮放"效果就可以不一樣,如圖1.22和圖1.23

圖1.22
圖1.23

圖1.22是矩形的底部中心定位在了(0,0)點(diǎn),而圖1.23里的矩形是中心定位在了(0,0)點(diǎn),所以一個(gè)縮放的時(shí)候是往上的,一個(gè)縮放的時(shí)候是向著兩邊的

????????再比如,可以做環(huán)形頻譜,而環(huán)形頻譜也有各種做法

????????甚至你可以自定義路徑的生成頻譜效果:

你要是愿意胡來,甚至可以在文字路徑上附著頻譜,這就相當(dāng)?shù)睾鷣砹耍?/p>

或者也可以做柱體的頻譜:

而且頻譜也可以利用上各種標(biāo)簽,比如透明啊模糊啊等等等等

????????Yutils下載:https://wwr.lanzoui.com/iU71Opznd4f? 密碼:9tec

????????剩下的代碼就繼續(xù)在視頻里面講了。




語音信號(hào)處理之分幀與窗函數(shù)(拓展知識(shí),不看影響不大)

? ? ? ? 前面說了一般的信號(hào)是非平穩(wěn)信號(hào),所以不拿整個(gè)時(shí)長(zhǎng)的信號(hào)做FFT,而是截取出來的一小段信號(hào)(一幀)來做FFT,因?yàn)樵诙虝r(shí)間內(nèi)信號(hào)就可以看成是平穩(wěn)信號(hào)了

圖1.24

如圖1.24,不用一整段信號(hào)而是分成一幀幀的,比如紅框框出來的部分是一幀。

? ? ? ? 那么,前面文章中講的是分完幀然后就直接做FFT了,但其實(shí)在語音信號(hào)處理中,并不是分幀以后直接就拿這一小段信號(hào)做FFT的。分幀又叫做信號(hào)截?cái)?/strong>,在做信號(hào)截?cái)鄷r(shí),是無法滿足周期截?cái)?/strong>的,所以就會(huì)導(dǎo)致頻譜泄露。

? ? ? ? 比如現(xiàn)在周期截?cái)嗟玫搅艘粠盘?hào),如下圖

對(duì)周期截?cái)嗟膸鯢FT就得到頻譜:

那如果是非周期截?cái)嗟玫降膸?,比?/p>

對(duì)非周期截?cái)嘈盘?hào)做FFT:

可以看到,在主頻點(diǎn)附近的頻點(diǎn)上,也有著許多不可忽視的能量。即主頻點(diǎn)能量泄露到附近頻點(diǎn)上了

所以因?yàn)榉侵芷诮財(cái)嗟玫降膸瑹o法滿足FFT的條件:信號(hào)要么從-∞到+∞?,要么為周期信號(hào),所以進(jìn)而做FFT時(shí),會(huì)導(dǎo)致頻譜泄露。

? ? ? ? 但是想要周期截?cái)嘈盘?hào)又很難做到,那么這時(shí)就需要用到加窗了。取出來的一幀信號(hào),在做傅里葉變換之前,要先進(jìn)行「加窗」的操作,即與一個(gè)「窗函數(shù)」相乘:

最左邊是截出的信號(hào),中間是窗函數(shù),相乘以后得到最右邊加窗后信號(hào)

加窗后的信號(hào)減小了兩端的坡度,使窗口邊緣兩端不引起急劇變化而平滑過渡到零,此時(shí),信號(hào)的起始時(shí)刻和結(jié)束時(shí)刻幅值都為0,也就是說在這個(gè)時(shí)間長(zhǎng)度內(nèi),信號(hào)可以視為周期信號(hào),這樣可以減輕語音幀的截?cái)嘈?yīng)了。所以加窗以后就可以減輕頻譜泄漏(不能避免頻譜泄露,只能減輕)了,但是加窗以后兩端的信號(hào)被削弱了,所以截?cái)嘈盘?hào)的時(shí)候不要背靠背地截取,而是要相互重疊一部分,分幀一般采用交疊分段的方法,這是為了使幀與幀之前平滑過渡,保持其連續(xù)性。前一幀和后一幀的交疊部分稱為幀移(英文:overlap)。幀移與幀長(zhǎng)的比值一般取為0到1/2。

不同的信號(hào)會(huì)選擇不同的窗函數(shù),甚至有時(shí)會(huì)用指數(shù)窗:

那么短時(shí)傅里葉變換STFT因?yàn)樾枰哟?,所以時(shí)域信號(hào)f(t)就要先乘以窗函數(shù)再做FFT,那么如果你要加窗的話,就要自己寫代碼了,因?yàn)閅utils里是沒有關(guān)于STFT的代碼的,只有一個(gè)FFT的局部函數(shù)。

【Aegisub】生成音頻頻譜的簡(jiǎn)單介紹的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
玉田县| 理塘县| 同心县| 新宾| 龙胜| 荔浦县| 扶余县| 金山区| 阿拉善右旗| 达日县| 馆陶县| 柳林县| 岳普湖县| 尼木县| 美姑县| 沾益县| 内江市| 紫金县| 武功县| 大足县| 安远县| 随州市| 普定县| 肇庆市| 福贡县| 界首市| 婺源县| 崇义县| 天台县| 开鲁县| 乐业县| 文昌市| 綦江县| 华坪县| 和龙市| 江阴市| 原平市| 阳信县| 寿宁县| 绥滨县| 阿克陶县|