주요 콘텐츠

spectrogram

단시간 푸리에 변환(STFT)을 사용하는 스펙트로그램

설명

신호의 스펙트로그램단시간 푸리에 변환(STFT)의 크기 제곱입니다. STFT는 신호의 주파수 성분이 시간에 따라 어떻게 변하는지 설명합니다.

s = spectrogram(x)는 신호 x의 STFT를 반환합니다. s의 각 열은 단시간으로 국소화된 x의 주파수 성분에 대한 추정값을 포함합니다.

예제

[s,f,t] = spectrogram(x,win,nOverlap,freqSpec)는 신호 x의 STFT와 함께, 주파수 f(rad/sample)와 샘플 인덱스 t를 반환합니다. 이때 spectrogram 함수는 다음을 수행합니다.

  • win을 사용하여 신호를 여러 세그먼트로 나누고 윈도우를 적용합니다.

  • nOverlap에 지정된 중첩 길이를 사용하여 인접 세그먼트 간에 샘플을 중첩합니다.

  • freqSpec에 지정된 지점 개수 또는 주파수에서, 윈도우가 적용된 각 세그먼트에 대해 이산 푸리에 변환을 계산합니다.

이러한 입력 인수에 디폴트 값을 사용하려면 빈 값 []을 지정하십시오.

예제

[s,f,t] = spectrogram(x,win,nOverlap,freqSpec,Fs)는 샘플 레이트 Fs를 지정하며, 순환 주파수 f(단위: Hz)와 시점 t를 반환합니다.

예제

[___,ps] = spectrogram(___,freqRange,spectrumType)는 주파수 범위와 스펙트럼 유형도 지정하며, x의 스펙트로그램에 비례하는 ps를 반환합니다. ps를 파워 스펙트럼 밀도(PSD) 추정값 또는 파워 스펙트럼 추정값으로 반환합니다. 이러한 입력 인수 중 하나를 지정하거나 둘 다 지정할 수 있습니다.

예제

[___,fc,tc] = spectrogram(___,"reassigned")는 각 PSD 추정값 또는 파워 스펙트럼 추정값을 해당 에너지의 중심 위치에 재할당합니다. 이 구문은 에너지 중심 주파수와 시간에 해당하는 fctc도 반환합니다.

올바르게 국소화된 시간 성분 또는 스펙트럼 성분이 신호에 포함된 경우 "reassigned" 인수는 더 선명한 스펙트로그램을 생성합니다.

예제

[___] = spectrogram(___,"yaxis",Name=Value)는 이름-값 인수를 사용하여 추가 옵션을 지정합니다. 최소 임계값, 출력 시간 차원, 스펙트로그램을 플로팅할 대상 부모 컨테이너를 지정할 수 있습니다.

대상 부모 컨테이너를 지정할 경우 "yaxis" 옵션은 ps의 플롯에서 주파수를 y축에 표시하고 시간을 x축에 표시합니다.

예제

spectrogram(___)을 출력 인수를 지정하지 않고 사용하면, 현재 Figure 창 또는 지정된 대상 부모 컨테이너에 데시벨 단위로 ps을 플로팅합니다.

예제

예제

모두 축소

정현파 간의 합으로 구성된 신호의 Nx=1024개 샘플을 생성합니다. 정현파의 정규화 주파수는 2π/5 rad/sample 및 4π/5 rad/sample입니다. 더 높은 주파수를 가진 정현파의 진폭은 상대 정현파 진폭의 10배입니다.

N = 1024;
n = 0:N-1;

w0 = 2*pi/5;
x = sin(w0*n)+10*sin(2*w0*n);

함수 디폴트 값을 사용하여 단시간 푸리에 변환을 계산합니다. 스펙트로그램을 플로팅합니다.

s = spectrogram(x);

spectrogram(x,"yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Samples, ylabel Normalized Frequency ( times pi radians/sample) contains an object of type image.

계산을 반복합니다.

  • 신호를 길이가 nsc=Nx/4.5인 섹션으로 나눕니다.

  • 해밍 윈도우를 사용하여 섹션에 윈도우를 적용합니다.

  • 연속 섹션 간에 50% 중첩을 지정합니다.

  • max(256,2p)개의 지점을 사용하여 FFT를 계산합니다. 여기서 p=log2nsc입니다.

두 접근 방식이 동일한 결과를 제공하는지 확인합니다.

Nx = length(x);
nsc = floor(Nx/4.5);
nov = floor(nsc/2);
nff = max(256,2^nextpow2(nsc));

t = spectrogram(x,hamming(nsc),nov,nff);

maxerr = max(abs(abs(t(:))-abs(s(:))))
maxerr = 
0

섹션 간에 50% 중첩을 가지면서 길이가 동일한 8개 섹션으로 신호를 나눕니다. 이전 단계에서와 동일한 FFT 길이를 지정합니다. 단시간 푸리에 변환을 계산하고 이전 2개 절차와 같은 결과를 제공하는지 확인합니다.

ns = 8;
ov = 0.5;
lsc = floor(Nx/(ns-(ns-1)*ov));

t = spectrogram(x,lsc,floor(ov*lsc),nff);

maxerr = max(abs(abs(t(:))-abs(s(:))))
maxerr = 
0

2초 동안 600Hz로 샘플링된 복소수 값의 볼록 2차 처프로 구성된 신호를 생성합니다. 처프의 초기 주파수는 250Hz이고 최종 주파수는 50Hz입니다.

fs = 6e2;
ts = 0:1/fs:2;
x = chirp(ts,250,ts(end),50,"quadratic",0,"convex","complex");

spectrogram 함수

spectrogram 함수를 사용하여 신호의 STFT를 계산합니다.

  • 신호를 각 샘플 길이가 M=49인 세그먼트로 나눕니다.

  • 인접 세그먼트 간에 중첩되는 샘플을 L=11로 지정합니다.

  • 더 짧은 최종 세그먼트는 무시합니다.

  • 바틀렛 윈도우로 각 세그먼트에 윈도우를 적용합니다.

  • NDFT=1024개 점에서 각 세그먼트의 이산 푸리에 변환을 평가합니다. 기본적으로 spectrogram은 복소수 값 신호에 대해 양측 변환을 계산합니다.

M = 49;
L = 11;
g = bartlett(M);
Ndft = 1024;

[s,f,t] = spectrogram(x,g,L,Ndft,fs);

waterplot 함수를 사용하여 STFT의 크기 제곱으로 정의되는 스펙트로그램을 계산하고 표시합니다.

waterplot(s,f,t)

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

STFT 정의

정의를 사용하여 Nx개 샘플 신호의 STFT를 계산합니다. 신호를 Nx-LM-L 중첩 세그먼트로 나눕니다. 각 세그먼트에 윈도우를 적용하고 NDFT개 점에서 이산 푸리에 변환을 평가합니다.

segs = framesig(1:length(x),M,OverlapLength=L);
X = fft(x(segs).*g,Ndft);

STFT의 시간과 주파수 범위를 계산합니다.

  • 시간 값을 찾으려면 시간 벡터를 중첩 세그먼트로 나눕니다. 시간 값은 세그먼트의 중간점이며 각 세그먼트는 하한에서 열린 구간으로 처리됩니다.

  • 주파수 값을 찾으려면 영주파수에서 닫히고 하한에서 열리는 나이퀴스트 구간을 지정합니다.

framedT = ts(segs);
tint = mean(framedT(2:end,:));

fint = 0:fs/Ndft:fs-fs/Ndft;

spectrogram의 출력값을 정의와 비교합니다. 스펙트로그램을 표시합니다.

maxdiff = max(max(abs(s-X)))
maxdiff = 
0
waterplot(X,fint,tint)

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

function waterplot(s,f,t)
% Waterfall plot of spectrogram
    waterfall(f,t,abs(s)'.^2)
    set(gca,XDir="reverse",View=[30 50])
    xlabel("Frequency (Hz)")
    ylabel("Time (s)")
end

2초 동안 1.4kHz로 샘플링된 처프로 구성된 신호를 생성합니다. 측정 시간 동안 처프의 주파수는 600Hz에서 100Hz로 선형적으로 감소합니다.

fs = 1400;
x = chirp(0:1/fs:2,600,2,100);

stft 디폴트 값

spectrogramstft 함수를 사용하여 신호의 STFT를 계산합니다. stft 함수의 디폴트 값을 사용합니다.

  • 신호를 한 세그먼트당 128개 샘플이 있도록 여러 세그먼트로 나누고 주기적 핸 윈도우를 사용하여 각 세그먼트에 윈도우를 적용합니다.

  • 인접 세그먼트 간에 96개 샘플이 중첩되도록 지정합니다. 이 길이는 윈도우 길이의 75%에 해당합니다.

  • 128개의 DFT 점을 지정하고 헤르츠 단위로 표현되는 STFT를 영주파수의 중심에 둡니다.

두 결과가 동일한지 확인합니다.

M = 128;
g = hann(M,"periodic");
L = 0.75*M;
Ndft = 128;

[sp,fp,tp] = spectrogram(x,g,L,Ndft,fs,"centered");

[s,f,t] = stft(x,fs);

dff = max(max(abs(sp-s)))
dff = 
0

mesh 함수를 사용하여 두 출력값을 플로팅합니다.

nexttile
mesh(tp,fp,abs(sp).^2)
title("spectrogram")
view(2), axis tight

nexttile
mesh(t,f,abs(s).^2)
title("stft")
view(2), axis tight

Figure contains 2 axes objects. Axes object 1 with title spectrogram contains an object of type surface. Axes object 2 with title stft contains an object of type surface.

spectrogram 디폴트 값

spectrogram 함수의 디폴트 값을 사용하여 계산을 반복합니다.

  • 신호를 길이가 M=Nx/4.5인 세그먼트로 나눕니다. 여기서 Nx는 신호의 길이입니다. 해밍 윈도우로 각 세그먼트에 윈도우를 적용합니다.

  • 세그먼트 간에 50% 중첩을 지정합니다.

  • max(256,2log2M)개의 점을 사용하여 FFT를 계산합니다. 양의 정규화 주파수에 대해서만 스펙트로그램을 계산합니다.

M = floor(length(x)/4.5);
g = hamming(M);
L = floor(M/2);
Ndft = max(256,2^nextpow2(M));

[sx,fx,tx] = spectrogram(x);

[st,ft,tt] = stft(x,Window=g,OverlapLength=L, ...
    FFTLength=Ndft,FrequencyRange="onesided");

dff = max(max(sx-st))
dff = 
0

waterplot 함수를 사용하여 두 출력값을 플로팅합니다. 두 경우 모두 주파수 축을 π로 나눕니다. stft 출력값의 경우 샘플 개수를 유효 샘플 레이트 2π로 나눕니다.

figure
nexttile
waterplot(sx,fx/pi,tx)
title("spectrogram")

nexttile
waterplot(st,ft/pi,tt/(2*pi))
title("stft")

Figure contains 2 axes objects. Axes object 1 with title spectrogram, xlabel Frequency/\pi, ylabel Samples contains an object of type patch. Axes object 2 with title stft, xlabel Frequency/\pi, ylabel Samples contains an object of type patch.

function waterplot(s,f,t)
% Waterfall plot of spectrogram
    waterfall(f,t,abs(s)'.^2)
    set(gca,XDir="reverse",View=[30 50])
    xlabel("Frequency/\pi")
    ylabel("Samples")
end

spectrogram 함수를 사용하여 신호의 순시 주파수를 측정하고 추적합니다.

2초 동안 1kHz로 샘플링된 2차 처프(Chirp)를 생성합니다. 주파수가 처음에는 100Hz이고 1초 후 200Hz로 증가하도록 처프를 지정합니다.

fs = 1000;
t = 0:1/fs:2-1/fs;
y = chirp(t,100,1,200,"quadratic");

spectrogram 함수에 구현된 단시간 푸리에 변환을 사용하여 처프의 스펙트럼을 추정합니다. 신호에 해밍 윈도우를 적용하고 길이가 100인 섹션으로 신호를 나눕니다. 인접 섹션 간 중첩 샘플 길이를 80개로 지정하고 100/2+1=51개 주파수에서 스펙트럼을 구합니다.

spectrogram(y,100,80,100,fs,"yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image.

(2000-80)/(100-80)=96개 시점에서 에너지가 가장 큰 시간-주파수 리지를 구하여 처프 주파수를 추적합니다. 스펙트로그램 플롯에 순시 주파수를 겹쳐 놓습니다.

[~,f,t,p] = spectrogram(y,100,80,100,fs);

[fridge,~,lr] = tfridge(p,f);

hold on
plot3(t,fridge,abs(p(lr)),LineWidth=2)
hold off

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (Hz) contains 2 objects of type image, line.

정현적으로 변하는 주파수 성분을 갖는 처프의 512개 샘플을 생성합니다.

N = 512;
n = 0:N-1;

x = exp(1j*pi*sin(8*n/N)*32);

이 처프에 대해 중심이 맞춰진 양측 단시간 푸리에 변환을 계산합니다. 신호를 32개 샘플 세그먼트로 나누고 중첩 샘플 길이를 16개로 지정합니다. 64개 DFT 점을 지정합니다. 스펙트로그램을 플로팅합니다.

[scalar,fs,ts] = spectrogram(x,32,16,64,"centered");

spectrogram(x,32,16,64,"centered","yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Samples, ylabel Normalized Frequency ( times pi radians/sample) contains an object of type image.

구간 (-π,π]에서 간격이 균일한 64개의 주파수에 대해 스펙트로그램을 계산하여 동일한 결과를 구합니다. 옵션 'centered'는 필요하지 않습니다.

fintv = -pi+pi/32:pi/32:pi;

[vector,fv,tv] = spectrogram(x,32,16,fintv);

spectrogram(x,32,16,fintv,"yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Samples, ylabel Normalized Frequency ( times pi radians/sample) contains an object of type image.

전압 제어 발진기와 3개의 가우스 원자로 구성된 신호를 생성합니다. 신호는 2초 동안 fs=2kHz로 샘플링됩니다.

fs = 2000;
tx = 0:1/fs:2;
gaussFun = @(A,x,mu,f) exp(-(x-mu).^2/(2*0.03^2)).*sin(2*pi*f.*x)*A';
s = gaussFun([1 1 1],tx',[0.1 0.65 1],[2 6 2]*100)*1.5;
x = vco(chirp(tx+.1,0,tx(end),3).*exp(-2*(tx-1).^2),[0.1 0.4]*fs,fs);
x = s+x';

단시간 푸리에 변환

pspectrum 함수를 사용하여 STFT를 계산합니다.

  • Nx개로 이루어진 샘플 신호를 길이 M=80 샘플의 세그먼트로 나누며, 이는 80/2000=40 밀리초의 시간 분해능에 해당합니다.

  • 인접 세그먼트 간에 L=16 샘플, 즉 20%가 중첩되도록 지정합니다.

  • 카이저 윈도우로 각 세그먼트에 윈도우를 적용하고 누설 =0.7을 지정합니다.

M = 80;
L = 16;
lk = 0.7;

[S,F,T] = pspectrum(x,fs,"spectrogram", ...
    TimeResolution=M/fs,OverlapPercent=L/M*100, ...
    Leakage=lk);

spectrogram 함수로 구한 결과와 비교합니다.

  • 윈도우 길이를 지정하고 샘플에서 직접 중첩합니다.

  • pspectrum은 항상 카이저 윈도우를 g(n)으로 사용합니다. 누설 과 윈도우의 형태 인자 ββ=40×(1-)의 관계를 갖습니다.

  • pspectrum은 이산 푸리에 변환을 계산할 때 항상 NDFT=1024개 점을 사용합니다. 양측 주파수 범위 또는 중심 주파수 범위에서 변환을 계산하려는 경우 이 숫자를 지정할 수 있습니다. 그러나 실수 신호의 디폴트인 단측 변환의 경우 spectrogram1024/2+1=513개 점을 사용합니다. 또는 이 예제와 같이 변환을 계산할 주파수 벡터를 지정할 수 있습니다.

  • 신호를 정확히 k=Nx-LM-L개 세그먼트로 나눌 수 없는 경우 spectrogram은 신호를 자르고 pspectrum은 신호에 0을 채워 여분의 세그먼트를 만듭니다. 출력값을 동등하게 만들려면 마지막 세그먼트와 시간 벡터의 마지막 요소를 제거하십시오.

  • spectrogram은 크기 제곱이 스펙트로그램인 STFT를 반환합니다. pspectrum은 이미 제곱되었지만 제곱 전에 인자 ng(n)으로 나눈 세그먼트별 파워 스펙트럼을 반환합니다.

  • 단측 변환의 경우 pspectrum은 스펙트로그램에 추가 인자 2를 추가합니다.

g = kaiser(M,40*(1-lk));

k = (length(x)-L)/(M-L);
if k~=floor(k)
    S = S(:,1:floor(k));
    T = T(1:floor(k));
end

[s,f,t] = spectrogram(x/sum(g)*sqrt(2),g,L,F,fs);

waterplot 함수를 사용하여 두 함수로 계산된 스펙트로그램을 표시합니다.

subplot(2,1,1)
waterplot(sqrt(S),F,T)
title("pspectrum")

subplot(2,1,2)
waterplot(s,f,t)
title("spectrogram")

Figure contains 2 axes objects. Axes object 1 with title pspectrum, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch. Axes object 2 with title spectrogram, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

maxd = max(max(abs(abs(s).^2-S)))
maxd = 
2.4419e-08

파워 스펙트럼 및 편의 플롯

spectrogram 함수에는 세그먼트별 파워 스펙트럼 또는 파워 스펙트럼 밀도에 대응하는 네 번째 인수가 있습니다. ps 인수는 pspectrum의 출력값과 유사하게 이미 제곱되었으며 정규화 인자 ng(n)을 포함합니다. 실수 신호의 단측 스펙트로그램의 경우 추가 인자 2를 꼭 포함해야 합니다. 함수의 스케일링 인수를 "power"로 설정합니다.

[~,~,~,ps] = spectrogram(x*sqrt(2),g,L,F,fs,"power");

max(abs(S(:)-ps(:)))
ans = 
2.4419e-08

출력 인수 없이 호출하면 pspectrumspectrogram 모두 데시벨 단위로 신호의 스펙트로그램을 플로팅합니다. 단측 스펙트로그램의 경우 인자 2를 포함시킵니다. 두 플롯의 컬러맵을 동일하게 설정합니다. x 제한을 동일한 값으로 설정하여 pspectrum 플롯 끝에 여분의 세그먼트가 보이도록 합니다. spectrogram 플롯에서 y축에 주파수를 표시합니다.

subplot(2,1,1)
pspectrum(x,fs,"spectrogram", ...
    TimeResolution=M/fs,OverlapPercent=L/M*100, ...
    Leakage=lk)
title("pspectrum")
cc = clim;
xl = xlim;

subplot(2,1,2)
spectrogram(x*sqrt(2),g,L,F,fs,"power","yaxis")
title("spectrogram")
clim(cc)
xlim(xl)

Figure contains 2 axes objects. Axes object 1 with title pspectrum, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image. Axes object 2 with title spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

function waterplot(s,f,t)
% Waterfall plot of spectrogram
    waterfall(f,t,abs(s)'.^2)
    set(gca,XDir="reverse",View=[30 50])
    xlabel("Frequency (Hz)")
    ylabel("Time (s)")
end

2초 동안 1kHz로 샘플링된 처프 신호를 생성합니다. 주파수가 처음에는 100Hz이고 1초 후 200Hz로 증가하도록 처프를 지정합니다.

fs = 1000;
t = 0:1/fs:2;
y = chirp(t,100,1,200,"quadratic");

신호의 재할당 스펙트로그램을 추정합니다.

  • 신호에 형태 파라미터 β=18을 사용하는 카이저 윈도우를 적용하고 길이가 128인 섹션으로 신호를 나눕니다.

  • 인접 섹션 간에 120개 샘플을 중첩하도록 지정합니다.

  • 128/2=65개 주파수와 (length(x)-120)/(128-120)=235개 시간 구간에서 스펙트럼을 구합니다.

출력 인수 없이 spectrogram 함수를 사용하여 재할당된 스펙트로그램을 플로팅합니다. y축에 주파수를 표시하고 x축에 시간을 표시합니다.

spectrogram(y,kaiser(128,18),120,128,fs,"reassigned","yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image.

imagesc 함수를 사용하여 다시 플로팅합니다. 주파수 값이 아래에서 위로 증가하도록 y축 방향을 지정합니다. 재할당된 스펙트로그램에 eps를 추가하면 데시벨로 변환할 때 음의 무한대가 될 가능성을 배제할 수 있습니다.

[~,fr,tr,pxx] = spectrogram(y,kaiser(128,18),120,128,fs,"reassigned");

imagesc(tr,fr,pow2db(pxx+eps))
axis xy
xlabel("Time (s)")
ylabel("Frequency (Hz)")
colorbar

Figure contains an axes object. The axes object with xlabel Time (s), ylabel Frequency (Hz) contains an object of type image.

2초 동안 1kHz로 샘플링된 처프 신호를 생성합니다. 주파수가 처음에는 100Hz이고 1초 후 200Hz로 증가하도록 처프를 지정합니다.

Fs = 1000;
t = 0:1/Fs:2;
y = chirp(t,100,1,200,"quadratic");

신호의 시간 종속 파워 스펙트럼 밀도(PSD)를 추정합니다.

  • 신호에 형태 파라미터 β=18을 사용하는 카이저 윈도우를 적용하고 길이가 128인 섹션으로 신호를 나눕니다.

  • 인접 섹션 간에 120개 샘플을 중첩하도록 지정합니다.

  • 128/2=65개 주파수와 (length(x)-120)/(128-120)=235개 시간 구간에서 스펙트럼을 구합니다.

각 PSD 추정값의 무게 중심 주파수와 시간을 출력합니다. -30dB보다 작은 PSD의 요소는 0으로 설정합니다.

[~,~,~,pxx,fc,tc] = spectrogram(y,kaiser(128,18),120,128,Fs, ...
    MinThreshold=-30);

중심 주파수와 시간의 함수로 0이 아닌 요소를 플로팅합니다.

plot(tc(pxx>0),fc(pxx>0),".")

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

2초 동안 2kHz로 샘플링된 실수 값 처프로 구성된 신호를 생성합니다.

fs = 2000;
tx = 0:1/fs:2;
x = vco(-chirp(tx,0,tx(end),2).*exp(-3*(tx-1).^2), ...
    [0.1 0.4]*fs,fs).*hann(length(tx))';

양측 스펙트로그램

신호의 양측 STFT를 계산하고 플로팅합니다.

  • 신호를 각 샘플 길이가 M=73인 세그먼트로 나눕니다.

  • 인접 세그먼트 간에 중첩되는 샘플을 L=24로 지정합니다.

  • 더 짧은 최종 세그먼트는 무시합니다.

  • 플랫 탑(Flat Top) 윈도우로 각 세그먼트에 윈도우를 적용합니다.

  • NDFT=895개 점에서 각 세그먼트의 이산 푸리에 변환을 평가합니다. 이때 홀수 개수라는 점에 유의하십시오.

M = 73;
L = 24;
g = flattopwin(M);
Ndft = 895;
neven = ~mod(Ndft,2);

[stwo,f,t] = spectrogram(x,g,L,Ndft,fs,"twosided");

출력 인수 없이 spectrogram 함수를 사용하여 양측 스펙트로그램을 플로팅합니다.

spectrogram(x,g,L,Ndft,fs,"twosided","power","yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

정의를 사용하여 양측 스펙트로그램을 계산합니다. 세그먼트의 샘플 길이가 M이고 인접 세그먼트 간의 중첩이 L이 되도록 신호를 나눕니다. 각 세그먼트에 윈도우를 적용하고 NDFT개 점에서 이산 푸리에 변환을 계산합니다.

y = framesig(x,M,Window=g,OverlapLength=L);
Xtwo = fft(y,Ndft);

시간과 주파수 범위를 계산합니다.

  • 시간 값을 찾으려면 시간 벡터를 중첩 세그먼트로 나눕니다. 시간 값은 세그먼트의 중간점이며 각 세그먼트는 하한에서 열린 구간으로 처리됩니다.

  • 주파수 값을 찾으려면 영주파수에서 닫히고 상한에서 열리는 나이퀴스트 구간을 지정합니다.

framedT = framesig(tx,M,OverlapLength=L);
ttwo = mean(framedT(2:end,:));

ftwo = 0:fs/Ndft:fs*(1-1/Ndft);

spectrogram의 출력값을 정의와 비교합니다. waterplot 함수를 사용하여 스펙트로그램을 표시합니다.

diffs = [max(max(abs(stwo-Xtwo)));
    max(abs(f-ftwo'));
    max(abs(t-ttwo))]
diffs = 3×1
10-12 ×

         0
    0.2274
    0.0002

figure
nexttile
waterplot(Xtwo,ftwo,ttwo)
title("Two-Sided, Definition")

nexttile
waterplot(stwo,f,t)
title("Two-Sided, spectrogram Function")

Figure contains 2 axes objects. Axes object 1 with title Two-Sided, Definition, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch. Axes object 2 with title Two-Sided, spectrogram Function, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

중심 스펙트로그램

신호의 중심 스펙트로그램을 계산합니다.

  • 양측 STFT에 사용한 것과 같은 시간 값을 사용합니다.

  • fftshift 함수를 사용하여 STFT의 영주파수 성분을 스펙트럼의 중심으로 이동합니다.

  • 홀수 값 NDFT의 경우 주파수 구간이 양끝에서 열립니다. 짝수 값 NDFT의 경우 주파수 구간이 하한에서 열리고 상한에서 닫힙니다.

출력값을 비교하고 스펙트로그램을 표시합니다.

tcen = ttwo;

if ~neven
    Xcen = fftshift(Xtwo,1);
    fcen = -fs/2*(1-1/Ndft):fs/Ndft:fs/2;
else
    Xcen = fftshift(circshift(Xtwo,-1),1);
    fcen = (-fs/2*(1-1/Ndft):fs/Ndft:fs/2)+fs/Ndft/2;
end

[scen,f,t] = spectrogram(x,g,L,Ndft,fs,"centered");

diffs = [max(max(abs(scen-Xcen)));
    max(abs(f-fcen'));
    max(abs(t-tcen))]
diffs = 3×1
10-12 ×

         0
    0.2274
    0.0002

figure
nexttile
waterplot(Xcen,fcen,tcen)
title("Centered, Definition")

nexttile
waterplot(scen,f,t)
title("Centered, spectrogram Function")

Figure contains 2 axes objects. Axes object 1 with title Centered, Definition, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch. Axes object 2 with title Centered, spectrogram Function, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

단측 스펙트로그램

신호의 단측 스펙트로그램을 계산합니다.

  • 양측 STFT에 사용한 것과 같은 시간 값을 사용합니다.

  • 홀수 값 NDFT의 경우 단측 STFT는 양측 STFT의 처음 (NDFT+1)/2개 행으로 구성됩니다. 짝수 값 NDFT의 경우 단측 STFT는 양측 STFT의 처음 NDFT/2+1개 행으로 구성됩니다.

  • 홀수 값 NDFT의 경우 주파수 구간은 영주파수에서 닫히고 나이퀴스트 주파수에서 열립니다. 짝수 값 NDFT의 경우 주파수 구간은 양끝에서 닫힙니다.

출력값을 비교하고 스펙트로그램을 표시합니다. 실수 값 신호의 경우 "onesided" 인수는 선택 사항입니다.

tone = ttwo;

if ~neven
    Xone = Xtwo(1:(Ndft+1)/2,:);
else
    Xone = Xtwo(1:Ndft/2+1,:);
end

fone = 0:fs/Ndft:fs/2;

[sone,f,t] = spectrogram(x,g,L,Ndft,fs);

diffs = [max(max(abs(sone-Xone)));
    max(abs(f-fone'));
    max(abs(t-tone))]
diffs = 3×1
10-12 ×

         0
    0.1137
    0.0002

figure
nexttile
waterplot(Xone,fone,tone)
title("One-Sided, Definition")

nexttile
waterplot(sone,f,t)
title("One-Sided, spectrogram Function")

Figure contains 2 axes objects. Axes object 1 with title One-Sided, Definition, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch. Axes object 2 with title One-Sided, spectrogram Function, xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

function waterplot(s,f,t)
% Waterfall plot of spectrogram
waterfall(f,t,abs(s)'.^2)
set(gca,XDir="reverse",View=[30 50])
xlabel("Frequency (Hz)")
ylabel("Time (s)")
end

spectrogram 함수는 각 세그먼트의 파워 스펙트럼 밀도(PSD) 또는 파워 스펙트럼의 행렬을 네 번째 출력 인수로 가집니다. 파워 스펙트럼은 PSD에 윈도우의 등가 잡음 대역폭(ENBW)을 곱한 것과 같습니다.

1초 동안 1kHz로 샘플링된 로그 처프로 구성된 신호를 생성합니다. 처프는 초기 주파수가 400Hz이며 측정이 끝나는 시점에는 10Hz까지 감소합니다.

fs = 1000;
tt = 0:1/fs:1-1/fs;
y = chirp(tt,400,tt(end),10,"logarithmic");

샘플 레이트를 사용하여 PSD와 파워 스펙트럼 분할하기

신호를 한 세그먼트당 102개 샘플이 있도록 여러 세그먼트로 나누고 핸 윈도우를 사용하여 각 세그먼트에 윈도우를 적용합니다. 인접 세그먼트 간에 12개 샘플이 중첩되도록 지정하고 1024개 DFT 점을 지정합니다.

M = 102;
g = hann(M);
L = 12;
Ndft = 1024;

디폴트 PSD 스펙트럼 유형을 사용하여 신호의 스펙트로그램을 계산합니다. STFT와 세그먼트 파워 스펙트럼 밀도의 배열을 출력합니다.

[s,f,t,p] = spectrogram(y,g,L,Ndft,fs);

스펙트럼 유형을 "power"로 지정하여 계산을 반복합니다. STFT와 세그먼트 파워 스펙트럼의 배열을 출력합니다.

[r,~,~,q] = spectrogram(y,g,L,Ndft,fs,"power");

두 경우 모두 스펙트로그램이 동일한지 확인합니다. 주파수에 로그 스케일을 사용하여 스펙트로그램을 플로팅합니다.

max(max(abs(s).^2-abs(r).^2))
ans = 
0
waterfall(f,t,abs(s)'.^2)
set(gca,XScale="log",...
    XDir="reverse",View=[30 50])

Figure contains an axes object. The axes object contains an object of type patch.

파워 스펙트럼이 파워 스펙트럼 밀도에 윈도우의 ENBW를 곱한 것과 같은지 확인합니다.

max(max(abs(q-p*enbw(g,fs))))
ans = 
1.6653e-16

세그먼트 파워 스펙트럼의 행렬이 스펙트로그램에 비례하는지 확인합니다. 비례 인자는 윈도우 요소 합계의 제곱입니다.

max(max(abs(s).^2-q*sum(g)^2))
ans = 
1.3235e-23

정규화 주파수를 사용하여 PSD와 파워 스펙트럼 분할하기

계산을 반복하되 이번에는 정규화 주파수를 사용합니다. 샘플 레이트를 2π로 지정하면 결과가 같아집니다.

[~,~,~,pn] = spectrogram(y,g,L,Ndft);
[~,~,~,qn] = spectrogram(y,g,L,Ndft,"power");

max(max(abs(qn-pn*enbw(g,2*pi))))
ans = 
1.1102e-16

감소하는 처프 2개와 광대역 스플래터 사운드를 포함하는 오디오 신호를 불러옵니다. 단시간 푸리에 변환을 계산합니다. 파형을 400개 샘플 세그먼트로 나누고 중첩 샘플 길이를 300개로 지정합니다. 스펙트로그램을 플로팅합니다.

load splat

% To hear, type soundsc(y,Fs)

sg = 400;
ov = 300;

spectrogram(y,sg,ov,[],Fs,"yaxis")
colormap bone

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

spectrogram 함수를 사용하여 신호의 파워 스펙트럼 밀도(PSD)를 출력합니다.

[s,f,t,p] = spectrogram(y,sg,ov,[],Fs);

medfreq 함수를 사용하여 두 처프를 추적합니다. 100Hz보다 높은 주파수와 광대역 사운드의 시작 전 시간으로 검색을 제한하여 더 강력한 저주파수 처프를 찾습니다.

f1 = f > 100;
t1 = t < 0.75;

m1 = medfreq(p(f1,t1),f(f1));

2500Hz보다 높은 주파수와 0.3초에서 0.65초까지의 시간으로 검색을 제한하여 약한 고주파수 처프를 찾습니다.

f2 = f > 2500;
t2 = t > 0.3 & t < 0.65;

m2 = medfreq(p(f2,t2),f(f2));

스펙트로그램에 결과를 겹쳐 놓습니다. 주파수 값을 1000으로 나누어 kHz로 표시합니다.

hold on
plot(t(t1),m1/1000,LineWidth=4)
plot(t(t2),m2/1000,LineWidth=4)
hold off

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains 3 objects of type image, line.

2초 동안 10kHz로 샘플링된 신호를 생성합니다. 신호의 순시 주파수를 시간에 대한 삼각 함수로 지정합니다.

fs = 10e3;
t = 0:1/fs:2;
x1 = vco(sawtooth(2*pi*t,0.5),[0.1 0.4]*fs,fs);

신호의 스펙트로그램을 계산하고 플로팅합니다. 길이가 256인 카이저 윈도우와 형태 파라미터 β=5를 사용합니다. 섹션 간 중첩 샘플 길이를 220개로 지정하고, 512개 지점에 DFT를 적용합니다. y축에 주파수를 플로팅합니다. 디폴트 컬러맵과 뷰를 사용합니다.

spectrogram(x1,kaiser(256,5),220,512,fs,"yaxis")

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

뷰를 변경하여 스펙트로그램을 폭포 플롯(Waterfall Plot)으로 표시합니다. 컬러맵을 bone으로 설정합니다.

view(-45,65)
colormap bone

Figure contains an axes object. The axes object with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type surface.

R2025a 이후

4개 신호에 대한 스펙트로그램을 지정된 대상 좌표축과 패널 컨테이너에 플로팅합니다.

3초 동안 10kHz의 샘플 레이트를 사용하여 4개의 진동 신호를 만듭니다.

Fs = 10e3;
t = 0:1/Fs:3;
x1 = vco(sawtooth(2*pi*t,0.5),[0.1 0.4]*Fs,Fs);
x2 = vco(sin(2*pi*t).*exp(-t),[0.1 0.4]*Fs,Fs) ...
    + 0.01*sin(2*pi*0.25*Fs*t);
x3 = exp(1j*pi*sin(4*t)*Fs/10);
x4 = chirp(t,Fs/10,t(end),Fs/2.5,"quadratic");

스펙트로그램을 대상 좌표축에 플로팅하기

새 Figure 창의 남서쪽 코너와 북동쪽 코너에 두 개의 좌표축을 만듭니다.

fig = figure;
ax1 = axes(fig,Position=[0.09 0.1 0.52 0.45]);
ax2 = axes(fig,Position=[0.55 0.7 0.42 0.25]);

신호 x1x2의 파워 스펙트럼을 각각 Figure의 남서쪽 축과 북동쪽 좌표축에 플로팅합니다. 주파수를 y축에 표시합니다. 512개 DFT 점, 256개 샘플의 카이저 윈도우, 220개 샘플의 중첩 길이를 사용합니다.

g = kaiser(256,5);
ol = 220;
nfft = 512;

spectrogram(x1,g,ol,nfft,Fs,"power","yaxis",Parent=ax1);
spectrogram(x2,g,ol,nfft,Fs,"power","yaxis",Parent=ax2);

Figure contains 2 axes objects. Axes object 1 with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image. Axes object 2 with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

스펙트로그램을 대상 UI 좌표축에 플로팅하기

새 UI Figure 창의 북서쪽 코너에 좌표축을 만듭니다.

uif = uifigure(Position=[100 100 720 540]);
ax3 = uiaxes(uif,Position=[5 305 300 200]);

신호 x3에 대한 PSD 추정값을 Figure 좌표축에 플로팅합니다. 주파수를 y축에 표시하고 중심을 0kHz에 맞춥니다.

spectrogram(x3,g,ol,nfft,Fs,"centered","yaxis",Parent=ax3);
title(ax3,"Spectrogram in UI Axes")

Figure contains an axes object. The axes object with title Spectrogram in UI Axes, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

스펙트로그램을 대상 패널 컨테이너에 플로팅하기

UI Figure 창의 남동쪽 코너에 패널 컨테이너를 추가합니다.

p = uipanel(uif,Position=[300 5 400 325], ...
    Title="Spectrogram in UI Panel", ...
    BackgroundColor="white");

신호 x4에 대한 PSD 추정값을패널 컨테이너에 플로팅합니다. 주파수를 y축에 표시합니다.

spectrogram(x4,g,ol,nfft,Fs,"yaxis",Parent=p);

Figure contains 2 axes objects and another object of type uipanel. Axes object 1 with title Spectrogram, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image. Axes object 2 with title Spectrogram in UI Axes, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

입력 인수

모두 축소

입력 신호로, 벡터로 지정됩니다.

예: x = chirp(0:0.001:1,0,0.5,100,"quadratic")은 2차 스윕 주파수 신호를 지정합니다.

데이터형: single | double
복소수 지원 여부:

윈도우로, 빈 값([]), 양의 정수 또는 벡터로 지정됩니다.

spectrogram 함수는 입력 신호 x를 세그먼트로 나누고 윈도우를 사용하여 세그먼트 샘플과 윈도우 값의 요소별 곱을 계산합니다. 윈도우 값은 이 인수를 어떻게 지정하는가에 따라 달라집니다.

  • 빈 값([]) — spectrogram 함수는 xnOverlap개의 중첩 샘플을 가지는 8개의 세그먼트로 나눠지도록 길이가 정해진 해밍 윈도우를 사용합니다.

  • 양의 정수 — spectrogram 함수는 x를 길이가 win인 세그먼트로 나누고 해당 길이의 해밍 윈도우를 사용합니다.

  • 벡터 — spectrogram 함수는 x를 벡터 win과 길이가 같은 세그먼트로 나누고 win에 지정된 윈도우를 사용합니다.

x의 길이를 nOverlap개의 샘플을 중첩시키면서 정수 개수의 세그먼트로 정확히 나눌 수 없는 경우, spectrogram 함수는 x를 적절하게 자릅니다.

사용 가능한 윈도우 목록은 윈도우 항목을 참조하십시오.

예: hann(N+1)(1-cos(2*pi*(0:N)'/N))/2는 모두 길이가 N + 1인 핸 윈도우를 지정합니다.

중첩 샘플의 개수로, 빈 값([]) 또는 음이 아닌 정수로 지정됩니다.

  • 빈 값([]) — spectrogram 함수는 세그먼트 간에 50% 중첩을 만드는 값을 사용합니다.

    세그먼트 길이가 지정되지 않은 경우 이 함수는 nOverlapNx / 4.5⌋로 설정합니다. 여기서 Nx는 입력 신호의 길이이고 ⌊ ⌋ 기호는 바닥 함수를 나타냅니다. 이 작업은 50% 중첩을 갖는 세그먼트의 개수가 8개에 최대한 근접하되 초과하지는 않도록 하는 가능한 한 가장 긴 섹션으로 나누는 것과 동일합니다.

  • 음수가 아닌 정수 — spectrogram 함수는 이 인수에 지정된 샘플 개수를 사용하여 인접 세그먼트를 중첩시킵니다.

    • win이 스칼라이면 nOverlapwin보다 작아야 합니다.

    • win이 벡터이면 nOverlapwin의 길이보다 작아야 합니다.

주파수 사양으로, 다음 값 중 하나로 지정됩니다.

  • 빈 값 []spectrogram 함수는 윈도우 길이보다 크거나 같은 첫 번째 2의 거듭제곱과 256 중에서 더 큰 값에 해당하는 개수의 DFT 지점을 사용하여 스펙트럼 추정값을 계산합니다.

  • 양의 정수 — spectrogram 함수는 이 인수에 지정된 DFT 지점 개수를 사용하여 스펙트럼 추정값을 계산합니다.

  • 요소가 두 개 이상인 벡터 — spectrogram 함수는 freqSpec에 지정된 주파수에서 스펙트럼 추정값을 계산합니다.

    • 샘플 레이트 Fs를 지정하는 경우 spectrogram 함수는 freqSpecFs와 단위가 동일한 순환 주파수로 가정합니다.

    • Fs를 지정하지 않으면 spectrogram 함수는 freqSpec를 정규화 주파수(단위: rad/sample)로 가정합니다.

예: freqSpec = 512는 512개 DFT 지점을 지정합니다.

예: freqSpec = pi./[8 4 2]는 세 개의 정규화 주파수로 구성된 벡터를 지정합니다.

데이터형: single | double

샘플 레이트로, 양의 스칼라로 지정됩니다. 샘플 레이트는 단위 시간당 샘플 개수입니다. 시간 단위가 초이면 샘플 레이트의 단위는 Hz입니다.

  • Fs를 빈 값([])으로 지정하면, spectrogram 함수는 입력 신호 x의 샘플 레이트를 1Hz로 가정합니다.

  • Fs를 지정하지 않으면, spectrogram 함수는 입력 신호 x의 샘플 레이트를 2π rad/sample로 가정합니다.

PSD 추정값 또는 파워 스펙트럼의 주파수 범위로, "onesided", "twosided" 또는 "centered"로 지정됩니다.

spectrogram 함수는 freqRange에 지정된 값, freqSpec에 지정된 DFT 점의 개수가 짝수인지 홀수인지 여부, Fs가 지정되었는지 여부에 따라 행 가수와 주파수 구간을 달리하여 ps를 반환합니다.

freqRangefreqSpecps의 행 개수

ps의 주파수 구간

Fs가 지정되지 않음

Fs가 지정됨

"onesided"
(x가 실수 값인 경우 디폴트 값)
짝수freqSpec/2 + 1[0,π] rad/sample[0,Fs/2] cycles/unit time
홀수(freqSpec + 1)/2[0,π) rad/sample[0,Fs/2) cycles/unit time
"twosided"
(x가 복소수 값인 경우 디폴트 값)
짝수 또는 홀수freqSpec[0,2π) rad/sample[0,Fs) cycles/unit time
"centered"짝수freqSpec(–π,π] rad/sample(–Fs/2,Fs/2] cycles/unit time
홀수(–π,π) rad/sample(–Fs/2,Fs/2) cycles/unit time

참고

  • freqSpec를 순환 주파수로 구성된 벡터 또는 정규화 주파수로 구성된 벡터로 지정할 경우 이 인수는 지원되지 않습니다.

  • x가 복소수 값인 경우 "onesided" 값은 지원되지 않습니다.

데이터형: char | string

파워 스펙트럼 스케일링으로, 다음 값 중 하나로 지정됩니다.

  • "psd"spectrogram 함수는 파워 스펙트럼 밀도를 반환합니다.

  • "power"spectrogram 함수는 PSD의 각 추정값을 윈도우의 등가 잡음 대역폭만큼 스케일링하고 각 주파수에서의 파워 추정값을 반환합니다. "reassigned"도 지정할 경우 spectrogram 함수는 재할당하기 전에 각 주파수 Bin의 너비에 대해 PSD를 적분합니다.

다음 표에서는 입력 신호 x, 윈도우 벡터 win, 중첩 길이 nOverlap, 주파수 사양 freqSpec, 샘플 레이트 Fs가 주어진 경우, ps에 반환되는 PSD 추정값과 파워 스펙트럼 추정값 간의 스케일링 관계를 보여줍니다.

샘플 레이트스케일링 관계
Fs가 지정됨

[~,~,~,psd] = spectrogram(x,win,nOverlap,freqSpec,Fs,"psd");
[~,~,~,pow] = spectrogram(x,win,nOverlap,freqSpec,Fs,"power");
이때 powpsd*enbw(win,Fs)와 동일합니다.

Fs가 지정되지 않음

[~,~,~,psd] = spectrogram(x,win,nOverlap,freqSpec,"psd");
[~,~,~,pow] = spectrogram(x,win,nOverlap,freqSpec,"power");
이때 powpsd*enbw(win,2*pi)와 동일합니다.

데이터형: char | string

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: spectrogram(x,100,OutputTimeDimension="downrows")x를 길이가 100인 세그먼트로 나누고 이 길이의 해밍 윈도우를 사용하여 각 세그먼트에 윈도우를 적용합니다. 스펙트로그램의 출력값은 행 방향으로 시간 차원을 갖습니다.

임계값으로, 데시벨을 단위로 하는 실수형 스칼라로 지정됩니다.

MinThreshold=th를 지정할 경우 spectrogram 함수는 10 log10(s) ≤ th 조건을 충족하는 s의 요소들을 0으로 설정합니다.

출력 시간 차원으로, 다음 값 중 하나로 지정됩니다.

  • "acrosscolumns"spectrogram 함수가 s, ps, fc, tc의 시간 차원을 열 방향으로 설정하고 주파수 차원을 행 방향으로 설정합니다.

  • "downrows"spectrogram 함수가 s, ps, fc, tc의 시간 차원을 행 방향으로 설정하고 주파수 차원을 열 방향으로 설정합니다.

이 인수는 spectrogram을 출력 인수와 함께 사용하는 경우 무시됩니다.

데이터형: char | string

R2025a 이후

대상 부모 컨테이너로, Axes 객체, UIAxes 객체 또는 Panel 객체로 지정됩니다.

Parent를 지정할 경우 spectrogram 함수는 출력 인수를 사용하여 함수를 호출하는지 여부와 관계없이 스펙트로그램을 지정된 대상 부모 컨테이너에 그립니다.

MATLAB® 그래픽스의 대상 컨테이너와 부모-자식 관계에 대한 자세한 내용은 그래픽스 객체 계층 구조 항목을 참조하십시오. 앱 설계 시 UIAxes 객체와 Panel 객체에서 Parent를 사용하는 방법에 대한 자세한 내용은 Plot Spectral Representations of Signal in App Designer 항목을 참조하십시오.

출력 인수

모두 축소

단시간 푸리에 변환(Short-time Fourier Transform, STFT) 출력으로, 행렬로 반환됩니다. 시간은 s의 열 방향으로 증가하고, 주파수는 0부터 시작하여 행 방향으로 증가합니다.

  • x가 길이가 Nx인 신호인 경우 sk개의 열을 가집니다. 여기서

    • k = ⌊(NxnOverlap)/(winnOverlap)⌋(win이 스칼라인 경우)

    • k = ⌊(NxnOverlap)/(length(win)nOverlap)⌋(win이 벡터인 경우)

  • x가 실수 값이고 freqSpec가 짝수이면 s는 (freqSpec/2 + 1)개 행을 가집니다.

  • x가 실수 값이고 freqSpec가 홀수이면 s는 (freqSpec + 1)/2개 행을 가집니다.

  • x가 복소수 값이면 sfreqSpec개 행을 가집니다.

  • "reassigned" 인수를 지정할 경우 s는 변경되지 않은 상태로 유지됩니다.

참고

freqRange"onesided"로 설정한 경우에는 spectrogram 함수가 양의 나이퀴스트 범위에 해당하는 s 값만 출력하고 총 전력을 보존하지 않습니다.

STFT 출력과 연결된 주파수로, 벡터로 반환됩니다.

  • Fs를 지정할 경우 f에는 순환 주파수(단위: Hz)가 포함됩니다.

  • Fs를 지정하지 않으면 f에는 정규화 주파수(단위: rad/sample)가 포함됩니다.

STFT 출력과 연결된 시간으로, 벡터로 반환됩니다.

  • Fs를 지정할 경우, t에는 시점(단위: 초)이 포함됩니다.

  • Fs를 지정하지 않으면 t에는 (sample numbers)/(2π)로 표현된 샘플 인덱스가 포함됩니다.

t의 값은 각 세그먼트의 중간 지점에 대응됩니다.

파워 스펙트럼 밀도(PSD) 또는 파워 스펙트럼으로, 행렬로 반환됩니다.

  • x가 실수 값이고 freqRange를 지정하지 않은 경우 또는 "onesided"로 설정한 경우, ps는 각 세그먼트의 PSD 또는 파워 스펙트럼의 수정된 단측 주기도 추정값을 포함합니다. 이 함수는 총 전력을 보존하기 위해 0 및 나이퀴스트 주파수를 제외한 모든 주파수에서 전력에 2를 곱합니다.

  • x가 복소수 값이거나 freqRange"twosided" 또는 "centered"로 설정한 경우, ps는 각 세그먼트의 PSD 또는 파워 스펙트럼의 수정된 양측 주기도 추정값을 포함합니다.

  • freqSpec에 정규화 주파수 벡터를 지정하거나 순환 주파수 벡터를 지정하면, ps는 입력 주파수에서 평가된 각 세그먼트의 PSD 또는 파워 스펙트럼의 수정된 주기도 추정값을 포함합니다.

에너지 중심 주파수와 시간으로, 단시간 푸리에 변환과 같은 크기의 행렬로 반환됩니다. 샘플 레이트를 지정하지 않으면 fc의 요소는 정규화 주파수로 반환됩니다.

spectrogram 함수는 "reassigned" 옵션을 지정한 경우에만 fctc를 반환합니다. fc 또는 tc의 각 재할당된 값이 범위를 벗어나는 경우, spectrogram 함수는 해당 값을 각각 ft의 대응하는 값으로 바꿉니다.

세부 정보

모두 축소

  • STFT 행렬에 0이 있는 경우 이를 데시벨로 변환하면 플로팅할 수 없는 음수 무한대가 생성됩니다. 이러한 문제를 방지하기 위해 spectrogram 함수는 출력 인수를 지정하지 않고 호출하거나 Parent 인수를 지정한 경우 STFT 행렬에 eps를 추가합니다.

  • STFT 행렬에 0에 매우 가까운 크기 값이 포함되어 있고 "reassigned" 옵션을 지정한 경우, 스펙트로그램 재할당이 수치적으로 민감해질 수 있습니다. 이러한 경우에는 "reassigned" 옵션을 사용하지 마십시오.

참고 문헌

[1] Boashash, Boualem, ed. Time Frequency Signal Analysis and Processing: A Comprehensive Reference. Second edition. EURASIP and Academic Press Series in Signal and Image Processing. Amsterdam and Boston: Academic Press, 2016.

[2] Chassande-Motin, Éric, François Auger, and Patrick Flandrin. "Reassignment." In Time-Frequency Analysis: Concepts and Methods. Edited by Franz Hlawatsch and François Auger. London: ISTE/John Wiley and Sons, 2008.

[3] Fulop, Sean A., and Kelly Fitz. "Algorithms for computing the time-corrected instantaneous frequency (reassigned) spectrogram, with applications." Journal of the Acoustical Society of America. Vol. 119, January 2006, pp. 360–371.

[4] Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. Discrete-Time Signal Processing. Second edition. Upper Saddle River, NJ: Prentice Hall, 1999.

[5] Rabiner, Lawrence R., and Ronald W. Schafer. Digital Processing of Speech Signals. Englewood Cliffs, NJ: Prentice-Hall, 1978.

확장 기능

모두 확장

버전 내역

R2006a 이전에 개발됨

모두 확장