Matlab 如何繪制復雜曲線的包絡線
http://jingyan.baidu.com/article/aa6a2c14d36c710d4c19c4a8.html
如果一條曲線(比如聲音波形)波動很大,曲折復雜,可以通過繪制包絡線的方式使其更加平滑和清晰。本經驗幫助剛接觸matlab不久的新手完成這一過程。
方法/步驟
-
處理前后的效果對比,圖示為某聲波傅里葉變換(fft)后的頻譜圖。
-
原數據為橫縱坐標為 frequency 和 Amplitude,都是<2048x1 double>的數據,即包含2048個數據點,由 subplot(2,2,1),plot(fr,Am); 繪制而成。
-
包絡線的生成,需要將原數據分成等寬度的小段,每段取一個最高點所對應的橫坐標和縱坐標(如圖所示)。比如設定每小段的長度為 d = 4 或 8 或 16(或2048的其他約數),然后運行
y=reshape(Amplitude,d,2048/d);
y=max(y);
x=linspace(0,max(frequency),2048/d);
所得 x 和 y 即為包絡線的橫縱坐標。
-
其中關鍵的函數為 reshape() 和 linspace()。
reshape() 函數重新調整矩陣的行數、列數、維數。reshape(X,m,n) 可以把矩陣 X 調整為 m 行 n 列的矩陣,比如:
>> reshape([1 2 3 4 5 6],2,3)
ans =
1 3 5
2 4 6
linspace() 用於生產線性矢量。 linspace(a,b,n) 可以生產從 a 到 b 之間共 n 個元素組成的一維數組。比如:
>> linspace(1,5,4)
ans =
1.0000 2.3333 3.6667 5.0000