spectrogram函數詳解

一、spectrogram函數用法

spectrogram函數是matlab中用於畫頻譜圖的函數。其中x是輸入信號,Fs是採樣率,window和noverlap是控制STFT(Synthesized Time-Frequency Transform)參數的變數,nfft是FFT計算的點數,fscale是控制顏色表縮放的變數。

其中,x與Fs是必填的參數,而window、noverlap、nfft和fscale則可以根據需要選擇輸入或使用默認參數。

    function [S,F,T] = spectrogram(x,window,noverlap,nfft,fs,validRange)
    % S = spectrogram(x,window,noverlap,nfft,fs) returns the short-time Fourier
    % transform of the input signal x. 
    % 
    % [S,F,T] = spectrogram(x,window,noverlap,nfft,fs) returns the STFT data S,
    % frequency vector F and time vector T.

如果只輸入x和Fs,則spectrogram函數會使用一些默認參數對信號進行處理,得到頻譜圖:

    [s, f, t] = spectrogram(x, Fs);
    imagesc(t, f, 20*log10(abs(s)));
    axis xy;
    colormap(jet);
    xlabel('Time (s)');
    ylabel('Frequency (Hz)');

此處,imagesc函數是將數據矩陣變成圖像的函數,20*log10是計算電平的函數,jet是色譜表的函數。

二、spectrogram函數功率譜密度是負數

根據功率譜密度的定義,其值始終為非負數,但是在spectrogram函數中卻很常見看到負數。這是由於在spectrogram函數中的功率譜密度被計算為複數的平方,因此產生了負數值。

我們可以通過如下代碼將功率譜密度修正為非負數:

    [s, f, t] = spectrogram(x, Fs);
    spect = abs(s).^2;
    imagesc(t, f, 20*log10(spect));
    axis xy;
    colormap(jet);
    xlabel('Time (s)');
    ylabel('Frequency (Hz)');

其中的abs函數將複數幅值提取出來,然後將其平方,就可以得到非負的功率譜密度。

三、spectrogram函數matlab

作為matlab的一部分,spectrogram函數可以在任何平台上使用matlab軟體進行操作,充分利用了matlab所提供的功能。

例如,我們可以使用spectrogram函數來比較兩個音頻文件的頻譜差異,以便更好地理解他們之間的不同之處:

    [s1, f1, t1] = spectrogram(x1, Fs1);
    [s2, f2, t2] = spectrogram(x2, Fs2);

    subplot(2,1,1);
    imagesc(t1, f1, 20*log10(abs(s1)));
    colormap(jet);
    axis xy;
    xlabel('Time (s)');
    ylabel('Frequency (Hz)');
    title('Signal 1');

    subplot(2,1,2);
    imagesc(t2, f2, 20*log10(abs(s2)));
    colormap(jet);
    axis xy;
    xlabel('Time (s)');
    ylabel('Frequency (Hz)');
    title('Signal 2');

這樣,我們可以在同一個圖像中查看兩個信號的頻譜圖像,更好地理解它們之間的差異。

四、matlab spectrogram函數

如果沒有使用matlab軟體,我們仍然可以使用matlab spectrogram函數來進行頻譜數據的處理和可視化。

例如,在Python中我們可以使用scipy中的sigal.spectrogram()函數來實現類似於matlab中的spectrogram函數的功能:

    import scipy.signal as signal
    from matplotlib import pyplot as plt
    import librosa

    y, sr = librosa.load("audio_file.wav", sr=None)
    f, t, Sxx = signal.spectrogram(y, sr)

    plt.pcolormesh(t, f, 20 * np.log10(Sxx), cmap='jet')
    plt.ylabel('Frequency [Hz]')
    plt.xlabel('Time [s]')
    plt.show()

這段代碼中我們首先使用librosa庫讀取音頻信號,然後使用signal.spectrogram()函數來計算頻譜數據。最後使用matplotlib庫來進行可視化處理。

五、spectrogram其他使用方法

在spectrogram函數中,還有許多其他的參數可以控制STFT,如窗口大小、窗口種類、重疊比例等,都可以根據實際的需求進行選擇和調整。

例如,我們可以通過改變窗口大小來調整頻譜圖的解析度:

    [s, f, t] = spectrogram(x, hann(1024), 512, 1024, Fs);
    imagesc(t, f, 20*log10(abs(s)));
    axis xy;
    colormap(jet);
    xlabel('Time (s)');
    ylabel('Frequency (Hz)');

這裡我們使用了窗口長度為1024個採樣點的漢寧窗,並且設置了50%的重疊比例,可以得到更高解析度的頻譜圖。

此外,還可以使用spectrogram函數來進行信號處理、特徵提取和分類等應用,如心電圖分析、語音識別和環境聲音識別等。

原創文章,作者:FSOVI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370771.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FSOVI的頭像FSOVI
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論