# 課程資訊 作業 * 影像嵌入與合成 * 資料視覺化分析 * 音訊分析與處理 * 人臉重建與辨識 * 多媒體創意發想 大專校院資訊應用服務創新競賽 # Overview 多媒體的定義很廣泛,包括 * 文字 * 圖 * 聲音 * 影片 * 動畫 # 數位媒體的儲存跟壓縮 ## Analog data v.s. Digital data * Analog data (類比) 連續值的資料,通常沒有data loss,故品質較高 ![](https://hackmd.io/_uploads/B1GsTfg1T.png) * Digital data (數位) 離散值的資料,有一定程度的data loss,但大小較小且較為可靠 ![](https://hackmd.io/_uploads/r1pjTzekT.png) 要將Analog data轉換成Digital data,可以根據Sampling以及Quantization來達成 ### Sampling(取樣) 針對原始資料,取出某些點以代表原資料 * sampling rate(取樣率) 越高,越能貼近原始資料 * Undersampling : 取樣率跟不上原始資料的變化 * Aliasing: 由於undersampling,導致無法重建出原始資料 * 為了避免Aliasing的現象發生,sampling rate至少要是原始資料的兩倍 (根據Nyquist Theorem) ![](https://hackmd.io/_uploads/HJo6xQeJ6.png) ### Quantization(量化) 將一定範圍的連續值離散化成整數,在一定範圍內的數字都會被量化成一個整數 ![](https://hackmd.io/_uploads/BygIN7gya.png =80%x) ex: fmin=0(資料的最小值) fmax=800(資料的最大值) L=8(想要將資料切成8段) f=80(還未量化的值) 則可以計算出 Q=100 (每個區間長100) Qi(f)= 0 (代表量化後的index為0) Q(f)=50 (代表量化後的值為50) bit depth(量化段數儲存所需的bit): 3 (2的三次方等於8) Quantization error: 30(原始值跟量化後之值的差距,加絕對值) ## Compression * Compression Rate: 壓縮後資料大小/壓縮前資料大小 壓縮的方法可以分成兩類 * lossless compression: 無損壓縮,可以復原成壓縮前的樣子 * Run-Length encoding * Entropy encoding * Arithmetic encoding * lossy compression: 有損壓縮,無法復原成壓縮前的樣子(ex: jpg) * Transform encoding ### Run-Length encoding (RLE) 1. 將二維的圖展開成一維 2. 用pair的方式記錄某個數字連續出現了幾次 ex: ![](https://hackmd.io/_uploads/B1QEzNxk6.png) 注意: (255,1000) 應該被拆成 (255,255),(255,255),(255,255),(255,235), 因為一個數字最多只能有8 bit來存 注意: 壓縮後不一定會變得比較小 ### Entropy(熵) Encoding Shannon’s Equation: ![](https://hackmd.io/_uploads/HkS54Eey6.png =50%x) * pi代表該像素顏色出現的頻率 (標準化後),所有顏色的pi相加總合為1 ex: ![](https://hackmd.io/_uploads/BJHkIVekT.png) 算出來的值是"平均要花幾個bit來儲存每個顏色"的理論最佳解 ### Shannon-Fano algorithm: 1. 針對每個顏色跟出現頻率建表 2. 對出現頻率排序 3. 每次都嘗試將當前table分成frequency盡量相同的兩半;table 左半部分配0,右半部分配1 4. 不斷遞迴進行第三步,直到當前table大小為1;此時分配的bit便是編碼 ex: ![image.png](https://hackmd.io/_uploads/SyY2Yu_Xp.png) * 將table分成[block, yellow, orange, green], [white, blue, red, green],兩邊的frequency 相差0,已是最小 * 遞迴進行左邊的table,分成[block], [yellow, orange, green],兩邊的frequency 相差72,已是最小 * 此時已可得出Block的編碼為00(被分配在了兩次左邊) ### Transform Encoding 在有損壓縮的過程中,通常會用到以下兩種常見的方法 * Discrete Cosine Transform (DCT) * Discrete Fourier Transform (DFT) 但DCT或DFT操作本身並不會丟失資料,是有損壓縮中的其他步驟才會丟失資料 # Digital Image Representation ## Bitmap * 使用像素來儲存圖片 以下三張照片分別顯示 ![](https://hackmd.io/_uploads/SJYT98K16.png) * 原圖 * Sampling rate過低 * Quantization過低 名詞介紹 Pixel dimensions: 圖片包含的總像素量 ( w*h ) Resolution: 每inch的像素量 ( r ),200ppi代表每平方itch中有200*200個像素 Image size: 物理上的圖片大小。a = w/r , b = h/r Frequency: 顏色值變動的程度;Frequency越高,顏色變化越平滑 ### 1D Discrete Cosine Transform 目的: 將一維的原始數據序列轉換為「頻域表示係數」(一組餘弦函數的權重) 基本公式: ![](https://hackmd.io/_uploads/ryqflTKJa.png =80%x) * F( u ): 頻域表示係數 (答案) * f( r ): 原始數據序列 (輸入) * M: 一維的像素數量 * u: 頻率,決定要使用哪個Basis function來轉換原始數據序列 * r: 位置,決定要使用Basis function上的哪個位置 其中,為了簡化計算,將公式中的這部分稱為**Basis function**,只會隨著u不同而改變 ![](https://hackmd.io/_uploads/rk8Z7ptkT.png =20%x) ex: **給定原始數據序列**: [f(0), f(1), f(2), f(3), f(4), f(5), f(6), f(7)] = [0, 0, 0, 153, 255, 255, 220, 220] 該原始數據序列代表的實際一維圖像如下 ![](https://hackmd.io/_uploads/HJBhQptk6.png =30%x) 從**原始數據序列中可得知M=8** 這時候先計算F(0),也就是u=0的情況 **u=0時的Basis function**如下圖所示 ![](https://hackmd.io/_uploads/HyFpGTF16.png) 上圖顯示**根據不同r,Basis function轉換出來的餘弦數值** (橫軸為r,可能值為0-7; 縱軸為轉換出來的餘弦數值,可能值為0-1) 接著根據公式,因為u=0,故此時的**C(u)= &radic;2 / 2** 最後,公式該有的都有了,便可以根據公式**計算出F(0)約等於389.97了** (可以看到在這個例子中,Basis function轉換出來的餘弦數值,不管r如何變動都是1,故第二行算式中便可以將cos那項直接替換成1) ![](https://hackmd.io/_uploads/Sy7PK6ty6.png) 計算F(1)、F(2)...的方法以此類推 最終答案為 [F(0), F(1), F(2), F(3), F(4), F(5), F(6), F(7)] = [389.97, -280.13, -93.54, 83.38 , 54.09, -20.51, -19.80, -16.34] 觀察可以發現,最終計算的結果「F(u), 0 <= u < 8」,其實可以想成**將原圖暴露在不同頻率(u)下的敏感程度**;也就是說,F(0)代表的是: 在包含8個像素的一維圖中,頻率參數(u)為0的情況下的敏感程度 其中,將F(0)稱為DC component,F(1)~F(7)稱為AC component ### 2D Discrete Cosine Transform ![](https://hackmd.io/_uploads/SJGz9DYyp.png =80%x) ### Compression using DCT DCT轉換的其中一個目的便是用於壓縮 1. 將原圖經由DCT轉換成 ![](https://hackmd.io/_uploads/HJgXRvFy6.png) 2. 透過Quantization Table 量化這些值,此時會發現多出了許多0 ![](https://hackmd.io/_uploads/SygjLCvKya.png) 3. 使用Zigzag Scan將二維 期中考題: 將s Zero Run-Length Encoding 重建回原始圖像 ### Bayer Color Filter 為了降低感知器成本,每個像素都會加上一個特定顏色的Bayer Color Filter,只儲存特定顏色的強度資訊,最後再藉由**Demosaicing**的步驟還原顏色 * 因為人眼對綠色較敏感,故綠色感知器數量占了整體的一半 * Nearest neighbor Algorithm 是實作Demosaicing的其中一種方法 * 取某個像素點周圍一圈"目標顏色感知器"的平均數值作為該點"目標顏色"的數值 ex: 1. 給定原始圖像、Bayer Color Filter,欲估算出位置A的顏色 (使用Nearest neighbor Algorithm) ![](https://hackmd.io/_uploads/ryscVuFkp.png) * 計算G chennel: 位置A本身的感知器是G,而真實顏色是紅色,故可確定位置A的G chennel為0 ->A(?, 0, ?) * 計算R chennel:位置A周圍有兩個R 感知器,其感知出來的值分別為255、255,固可猜測位置A的R chennel為$\frac{255+255}{2}$ ->A(255, 0, ?) * 計算B chennel:位置A周圍有兩個B 感知器,其感知出來的值分別為255、255,固可猜測位置A的B chennel為$\frac{255+255}{2}$ ->A(255, 0, 255) 當採樣率不足時,這種方法可能會導致Aliasing的問題(計算出來的顏色跟原始顏色不一致) ### Anti-aliasing 一種用來解決斜線Aliasing的演算法 用某像素黑跟白的占比來計算該格像素的灰階值,便可以使直線看起來更直 ![](https://hackmd.io/_uploads/ByT2w_Yka.png) ## Color 顏色的三大特徵: 1. Hue: 色調 2. Saturation: 飽和度 (顏色純度) 3. Luminance: 亮度 (明度) ### RGB color model C = rR + gG + bB * R、G、B是根據這三種顏色的波長決定的常數 * r、g、b代表混和的比例 * RGB圖片轉灰階的時候,用以下的參數轉換 L = 0.30R + 0.59G + 0.11B * 優點: 工程設計容易 * 缺點: 因為只能顯示個顏色的正值,故無法精確顯示出真實的顏色 ### CMY(Subtractive Color Mixing) color model * 用"減法"來實現顏色的混和,所以 (0,0,0)代表的是白色 * RGB與CMY之間的轉換 (R、G、B皆以標準化至0-1間): * C = 1 – R (青色) * M = 1-G (洋紅色) * Y = 1 – B (黃色) CMY 三種顏色混和後結果理論上是黑色,但實際上會是深棕色的,為了解決這個問題,引入了CMYK model: 1. 設k=min(C,M,Y) 2. 新的CMY值如下 * C_new = C – K * M_new = M - k * Y_new = Y – K * CMYK model常見於印刷方面 ### HSV color model 使用**色調、飽和度、亮度**來表示顏色 1. 色調(Hue): 從0度開始,代表紅色,逆時針旋轉增加相對應的值,最大轉360度回到紅色 2. 飽和度(Saturation): 距離六邊形中心的距離(水平),值落在0-1之間,值為1時為純色 3. 明度 (Value): 值落在0-1之間(垂直),值為0時為黑色 ![](https://hackmd.io/_uploads/r1oZQifl6.png =50%x) ### YIQ color model Y、I、Q的值可以經由RGB轉換得到 ![](https://hackmd.io/_uploads/BJTDNszg6.png =50%x) * 長用於**商業電視廣播**與**影像壓縮** ### CIE color model * 可表示所有可見色彩 * 在CIE model中,兩個點之間的距離**並不跟**兩種顏色之間的感知差異呈正比 ![](https://hackmd.io/_uploads/r10aHizl6.png =70%x) ## vctor graphic 另一種儲存圖片的方法,相較於bitmap,各有優缺點跟適用範圍 ![](https://hackmd.io/_uploads/H1K4ZEMg6.png =70%x) * Vector graph 由數學公式所描述的幾何圖形(ex: 點、線、曲線和多邊形等)跟顏色組成 * 相較於 bitmap,vctor graphic遇到的aliasing problems較輕微 * Vector graph適用於純色和具有清晰邊緣的圖片 ## Parametric Curve (參數曲線) * 需要n+1 個 control points 來將一個n次多項式轉成Parametric repersentation Parametric repersentation: ![](https://hackmd.io/_uploads/rJDSexBZT.png) * P(t): 生成的曲線 * x(t)y(t): 曲線上的某點座標 * 𝑎𝑥 𝑎𝑦 𝑏𝑥 𝑏𝑦 𝑐𝑥 𝑐𝑦 𝑑𝑥 𝑑𝑦: 需要確定的係數(control points) ## Bézier curves * Bézier curves 是一種 Parametric Curve * Bézier curves 由任意數量的control points 描述而成 計算: ![](https://hackmd.io/_uploads/ry39DzS-6.png =70%x) P(t) = [x(t) y(t)] = T * M * G * P(t): Bézier curves,由x(t)、y(t)組成 (所求) ![image.png](https://hackmd.io/_uploads/Bkxx3P1tmp.png =70%x) * T: 次方係數 * M: basis matrix: 固定係數 * G: geometry matrix,由control points組成 (題目給定) 性質觀察(舉一個由四個control points(p0~p3)描述而成的Bézier curves為例): ![](https://hackmd.io/_uploads/H1SjMgHWT.png =70%x) * Bézier curves的起點跟終點分別是 p0 跟 p3 * 線段p0p1、p2p3是Bézier curves的切線 * p0、p1、p2、p3 對應於t的值分別為0、1/3、2/3、1 Blending Function: general Bézier curves 將P(t)寫成另一種形式後 ![](https://hackmd.io/_uploads/ByP-YGSbp.png) * 觀察可發現其實係數就是巴斯卡三角形 * 故Bézier curves的general form 可寫成 ![image.png](https://hackmd.io/_uploads/ryOqtkF7a.png) ### de Casteljau algorithm 該演算法方便的手繪Bézier curves ![image.png](https://hackmd.io/_uploads/HkrncytXa.png) * 根據給定的那四個control points,計算出中間點$p_{01}$、$p_{12}$、$p_{23}$ * 根據$p_{01}$、$p_{12}$計算出$p_{012}$ * 根據$p_{12}$、$p_{23}$計算出$p_{123}$ * 根據$p_{012}$、$p_{123}$計算出$p_{0123}$,此時該點保證落在Bézier curves上 ![image.png](https://hackmd.io/_uploads/SJoPokt7T.png) * 接著遞迴取四個點(靠曲線內側)找出其他在Bézier curves上的點 # Digital Image Processing ## Digital image type 1. .bmp (Windows bitmap) * 支援1~24 bit 的color depth(可選2^24種顏色) * 若使用alpha channel(透明度),則color depth為32 2. .gif (Graphics Interchange Format) * 支援256種顏色,支援透明度,但不能使用alpha channel * 支援簡單動畫 * 使用 LZW 壓縮 * 支援漸進式下載 (逐漸載入更高清的版本) 3. .jpg (Joint Photographic Experts Group) * 適用於連續色調的圖片 * 有損壓縮 4. .png (Portable Network Graphics) * 支援1~64 bit 的color depth,並支援alpha channel * 無損壓縮 補充: palette(調色板): 調色板是一個包含了圖像中可能使用的不同顏色選項的表格,圖像中的每個像素通過指向調色板中的特定顏色來表示其顏色。針對那些使用顏色不多的圖片,可以有效節省存儲空間 ## Color Quantization 使用**indexed color**的技巧,用 palette(調色板)管理圖片的color以節省空間 目標: 將bit depth 為 n 的原始圖像轉成 bit depth 為 B 的新圖片 1. 確定原始圖像中實際出現的那些顏色 2. **選擇2^b種顏色**作為新圖片用到的顏色 3. 建表儲存index與真實顏色的對應表,並將不存在於新圖中的顏色對應至最接近的顏色(最小平方法) ![](https://hackmd.io/_uploads/HkfWHQHZT.png =50%x) 至於要怎麼選2^b種顏色,以下是幾種可能的演算法 ### Popularity algorithm 選擇出現頻率最多的2^n種顏色作為調色板 ### Uniform partitioning Algorithm (均勻分割) 1. 將原圖中出現的所有顏色放置於三維空間中,並用一個最小的正方體包住所有點 ![](https://hackmd.io/_uploads/r1rQuSAbp.png) 2. 分割這個正方體的邊界,直到分成2^b種 ex: 3. 在同一小長方體的點會被同化成同一種顏色(可以取小長方體的中心or 使用Popularity algorithm) 缺點: 若有許多顏色都在同一個長方體中,會都變成同一種顏色,導致漸層的效果消失 ### Median-cut algorithm (中位數分割) 優化Uniform partitioning Algorithm,解決上述演算法的缺點 1. 在分割正方體邊界時,先沿著較長邊將正方體分成兩個內部點數相同的長方體 2. 遞迴的用上述方法分割小長方體,如此一來便能保證每個長方體中的點數相同 ![](https://hackmd.io/_uploads/H1ZRFrCWp.png) ### Octree Algorithm 建樹, * 每個節點有8個子節點 ![](https://hackmd.io/_uploads/SkVZ3BCW6.png) * 範例的顏色可藉由走訪圖中的節點順序來唯一決定 (每個葉節點便代表一種顏色) 演算法步驟: 1. 針對遇到的前2^b種顏色,建出其從root 到leaf的路徑 2. 當第17種顏色出現時,找最接近的顏色並與其取平均,成為新的顏色 所以這棵樹始終只有2^n個葉節點,並僅包含需要的部分 ### Dithering(抖動) 在顏色總量不變的情況下,可以藉由這種方式創建假的新顏色 ![](https://hackmd.io/_uploads/SJybE8CbT.png =50%x) 應用: Noise dithering 1. 針對每個像素,先隨機產生一個在0-255間的數字 2. 若該像素值大於該隨機數,則該像素值設成255;若該像素值小於該隨機數,則該像素值設成0 應用: Average dithering 1. 先計算出所有像素的平均值 2. 若該像素值大於平均值,則該像素值設成255;若該像素值小於平均值,則該像素值設成0 應用: Pattern Dithering 1. 將原圖片分成許多Block,每個block套用一個threshold matrix 2. 若某像素值大於threshold matrix對應位置上的值,則該像素值設成255;若某像素值小於threshold matrix對應位置上的值,則該像素值設成0 ![image.png](https://hackmd.io/_uploads/ryycNBtQT.png =50%x) * 藉由每一個小區塊中黑與白的比例,可以在視覺上造成灰階的效果 應用: Error Diffusion Dithering(Floyd-Steinberg algorithm) * 必考 先定義mask,例如 ![](https://hackmd.io/_uploads/rkyRwLAba.png) 設定變數e 若p<128 則e=p 否則 e=p-255 (效果: 當某像素為深色時,鄰居會被調整成淺色,反之亦然) 將某個像素的結果擴散至其鄰居上(根據mask的權重),像素的遍歷順序是從左上角起的zip zap ![](https://hackmd.io/_uploads/H1bruU0W6.png) 針對每個像素都做一次這種操作 ## Image transfromation 指的是改變圖片像素顏色或灰階值的過程 ### Gamma Transform ![](https://hackmd.io/_uploads/HJ1F2UCZa.png =30%x) ![](https://hackmd.io/_uploads/BkdohURW6.png) * 當gamma>1 圖片變暗 * 當gamma<1 圖片變亮 ### Convolution(捲積運算) ![](https://hackmd.io/_uploads/r1XD0L0Wp.png) 經過捲積運算後,圖片會少一圈,為了解決這個問題,可以事先在原圖中補上一圈0或一圈鄰居值 應用: Gaussian blur 目的: 模糊 捲稽核: ![](https://hackmd.io/_uploads/SyMwkwAb6.png =30%x) 應用: edge-detection filter 目的: 邊緣檢測 捲稽核: ![](https://hackmd.io/_uploads/BkcvZPR-6.png) * filter後,負值要改成0,正值改成255 應用: Unsharp mask 目的: 銳化 捲稽核: ![](https://hackmd.io/_uploads/H13oWw0Za.png) ## Resampling 改變圖片像素總數的過程 * Replication: 單純將1*1的像素放大成2*2的 ![image.png](https://hackmd.io/_uploads/rJ0wF8F7T.png) * row-column deletion: 單純將2*2的像素縮小成1*1的 ---期中考線--- # 其他壓縮法 ## LZW compression 1. 將圖片中出現的所有顏色建表 ![image](https://hackmd.io/_uploads/Hy6u_N7V6.png) 2. 從第一格開始sliding window(初始化i=j=1, 1-indexed),j不斷+1,直到i~j這個區域不在表中 ![image](https://hackmd.io/_uploads/BJKTKEQVa.png) 3. 將不在表中的i\~j這個區域寫進表中(table[7]=yy),將i~j-1代表區域的index寫進答案中,接著i=j=原本的j(本例j=2),繼續進行第二跟第三步 ![image](https://hackmd.io/_uploads/HyKrc4X4a.png) ## Huffman encoding 概念: * 出現頻率低的顏色會被賦予bit長度更多的編號 * 任兩個編碼結果的前綴一定不一樣 1. 先統計出圖片中所有出現的顏色各自的出現頻率 2. 將這些顏色作為leaf,出現頻率作為node value 3. 每次都挑出node value最小的兩個點,將其連接起來創造新的節點 * ex: 第一輪中,將70跟50連接起來,創造120的節點 4. 不斷重複第三步,直到做出根節點為止 5. 對於每個顏色的編碼,從根節點出發,往左走編號為0,往右走編號為1,走到leaf即為該顏色的編號 ![image](https://hackmd.io/_uploads/HJm4uH5NT.png) ## JPEG 壓縮全步驟 # Audio Representation ## 常見名詞介紹 Phase angle(相位角): t=0 時的角度 ![image](https://hackmd.io/_uploads/SJaJxH74p.png =50%x) 相位差: ![image](https://hackmd.io/_uploads/SkjGxrmNp.png =50%x) Angular Frequency(角頻率): ω = 2πf * sin(ω)可用於表示一個波的頻率 * ex: sin(2π) 代表頻率為1的波 Amplitude(振幅): ![image](https://hackmd.io/_uploads/ryY_bSQN6.png =50%x) Decibels(分貝): ![image](https://hackmd.io/_uploads/SyZxIHXNT.png) * Decibels-sound-pressure-level (dB_SPL): 聲壓級數 * Decibels-sound-intensity-level (dB_SIL): 聲音強度級數 ## Audio Dithering 可以讓噪音跟原聲分離 ## Noise Shaping 目的: 將噪音的部分轉移至頻率較高的區域,在當前採樣率下,便會因為頻率過高而被丟失;同時不會變動到原本想要保留的聲音 * 定義F_in代表N個未經量化的採樣點 * 定義F_out代表N個量化後的採樣點 * 計算: * F\_in$_{i}$ = F_in$_{i}$ + D$_{i}$ + cE$_{i-1}$ * E$_{i}$ = F_in$_{i}$ − F_out$_{i}$ ## μ-law Function * 一種 non-linear quantization 的方法 * 原因: * 震幅越大,quantization error 的效果越不明確 * 若能為低振福的部分做更細的採樣,便能提升品質 * ![image](https://hackmd.io/_uploads/HknDWiBHT.png) * 舉例來說,original value (震幅) 為 6-11 (很小)時,一般的壓縮方法誤差為100%,但non-linear quantization 卻能使誤差降到 26% 公式: ![image](https://hackmd.io/_uploads/Sy9-lorB6.png =80%x) ex: 反函式的公式,可以逆向操作 加分: 類似μ-law Function 的圖片 gamma transform ## 音頻分析 共有三種分析方法 ### Time domain ![image](https://hackmd.io/_uploads/Bk0YLsHr6.png) * x 軸: 時間 * y 軸: 震幅 ### frequency analysis ![image](https://hackmd.io/_uploads/SJGj8sBHp.png) * x 軸: 頻率 * y 軸: 當前頻率下的強度 (震幅) ### Spectral view ![image](https://hackmd.io/_uploads/Bk2TIsHH6.png) * x 軸: 時間 * y 軸: 頻率 * 顏色: 當前時間頻率下的強度 (震幅) ## Fourier Series 目的是將複雜的波轉成 "infinite sum of sin and cos function" ![image](https://hackmd.io/_uploads/SJdS_iHr6.png) * a0: DC component,代表震幅的平均值 * an: ## Discrete Fourier Transform (DFT) 跟之前學過的DCT 不同的是,多了 sin 這一項 計算: ![image](https://hackmd.io/_uploads/HJ-L_2Hra.png) * 將 {8, 4, 8, 0} 轉換成 {5, -i, 3, i} ## Inverse Discrete Fourier Transform ![image](https://hackmd.io/_uploads/HJ_Od3rrT.png) ## 計算意義 ![image](https://hackmd.io/_uploads/HkoS92HSp.png) ## FFT window 大小會在?跟?兩者之間取捨 ## Frequency Analysis 的應用 1. 語音識別 2. 語音模仿 3. 音效模擬 * 若一個音的頻率是另一個音的2^n倍,則聽起來只有高低八度(octave)的差別 * 又鋼琴中一個八度間有 12 階,故每一階的平均頻率差值約為 1.059463 # Digital Audio Processing * 常見音樂檔名 * .mp3 * .ogg: 優點是開放性、高音質、壓縮率高 * .wma/ .asf: 過去年代流行的格式 看過那些常見音樂黨名 ## Dynamics Processing * dynamic range: 指的是音檔中"最大"與"最小"聲音之的差距 (也就是動到震幅) ### limiting (clipping) * 將震幅範圍限制在一定範圍間 * 分成 * hard limiting: 超過範圍的部分會被直接修改成範圍極值 * soft limiting: 能更平滑的將音檔震幅轉換至範圍之內 ![image](https://hackmd.io/_uploads/Syflf1JLp.png =70%x) ## Normalization * 能將聲音平均的放大,通常搭配壓縮使用,以使震幅較小的部分也能一同放大 ## Compression and Expansion * 這邊的 Compression 指的是讓 dynamic range 變小的轉換過程; Expansion 則相反 * Downward: 指的是向下調整部分區域震幅的過程 * Upward: 指的是向上調整部分區域震幅的過程 ![image](https://hackmd.io/_uploads/r1ju8yJIa.png =50%x) ## Digital Audio Filter * 相當於應用於音訊處理的捲積運算,目的為 * 提取特徵 ### FIR ### IIR Filter 利用遞迴的方式 ### 不同 filter 介紹 * 各種不同的 h(n) 達成的效果 (FIR 應用,在 frequency domain 進行) ![image](https://hackmd.io/_uploads/r1qw2GdUT.png) * Comb filter: 將過去的 output 加到當前的 output 中,以製造回聲效果 (IIR 應用) ![image](https://hackmd.io/_uploads/Ski2pzdU6.png) * one-fold echo: 單回聲版本 * multiple-fold echo: 多回聲版本 * Shelving filters: **增強或減弱**音檔的**高頻或低頻**部分 ![image](https://hackmd.io/_uploads/rk2yJQ_Ua.png) * 應用: Equalization(EQ, 均衡化): 增強或減弱特定頻率的過程 * 其中,特定頻率稱為band ![image](https://hackmd.io/_uploads/rkOC1mu8p.png) * Peaking filter: 比更平滑的 filter ![image](https://hackmd.io/_uploads/BJp7gQd8a.png =50%x) ### convolution theorem 在 time domain 做 convolution 相當於在 frequency domain 做相乘 ![image](https://hackmd.io/_uploads/HkpOxQ_IT.png =70%x) * x(n): 原始資料 * y(n): x(n) 經過 filter 後的結果 ### FIR Filter Design * 儘管根據 convolution theorem, H(n) 可以被轉成 h(n),但實務上,漂亮的 H(n) 可能會變成很醜的 h(n) * 可以使用 windowing function,擷取轉換後的 h(n) 的一小部分來做捲積 * 缺點: 經過 windowing function擷取後的 h(n)在轉換後,再轉回 H(n) 時,沒辦法完美還原 ## Pitch Shifting * Harmonics Components: 樂器產生出來的某個音,其實是由一系列不同頻率組成,並分為 * fundamental frequency: 基頻 * harmonics: 協波 ![image](https://hackmd.io/_uploads/SkBcCXdIa.png =70%x) * 由於一個八度有12個音階,故調整音高的方法非常直觀 ![image](https://hackmd.io/_uploads/r1YV1VOIp.png =50%x) ### Simple Idea 1. 將音樂長度擴展為原本的兩倍 (2 稱為 scaling factor) 2. 將頻率變成 scaling factor 即可 ![image](https://hackmd.io/_uploads/B1qTy4uL6.png =70%x) ### Phase Vocoder ## MPEG Compression ### 心理聲學 * 1000 Hz ~ 5000 Hz 強度不高便能聽到,反之其他頻率則需要更強的強度才能被聽見 * 低頻中頻率的變化較為敏感 * 10 Hz ~ 15 Hz 聽起來的變化較 10000 Hz ~ 10005 Hz 多 * 低頻的 critical band(頻率區段) 較高頻窄 * 若某個頻率的聲音強度非常高,則鄰近的頻率強度必須要更高才能被聽見 ### MPEG 壓縮步驟 1. 將 audio file 切成需多 frame,針對每個 frame 執行以下 2~7 步 # Digital Video ## 常見觀念 * Raster scanning: * Interlaced scanning * progressive scanning ## aspect ratio 目的是將原圖 resize 成較小的圖片 ![image](https://hackmd.io/_uploads/HJHR7w-Dp.png) * 計算原圖的能量圖,當某個像素跟鄰居差異大時,其能量較高 * Crop: 用 sliding window 切出能量總和最大的畫面 * Column: 刪除原圖中的某些欄,保留能量最大的那些欄 ### seam carving 概念: 透過每次移除畫面上的縫線 (紅色部分),以降低原圖中的長寬 ![image](https://hackmd.io/_uploads/H1NsHwWPp.png =50%x) 定義縫線: ![image](https://hackmd.io/_uploads/r1G6rDWPT.png) * 相鄰的縫線 pixel 位移不能超過 1 * 找到縫線的演算法 * 使用動態規劃找到一條 energy 最小的縫線,並將其從圖片中移除