
위 그림과 같이, 데이터를 일정 크기로 끊어서 FFT를 수행하고, 주파수 별 강도로 변환된 결과를 세워서 쭉 이어 붙인 것이 스펙트로그램입니다.
이 일정 크기(한 마디)를 Window Size라고 하고, 각 Window 간에 중첩을 두어 진행하는데 이를 Overlap 이라고 합니다. 보통은 Window Size의 절반 크기를 Overlap으로 설정합니다.
IDL에서 TS_SPECTROGRAM 함수를 사용하면(TS는 Time Series를 의미합니다), 간단하게 Spectrogram을 생성할 수 있습니다.
----------
file="C:\mysong192.mp3"
ok = query_video(file, streams = strms)
help, strms[0], /struct
** Structure <118eb7f0>, 9 tags, length=56, data length=52, refs=2:
PID LONG 0
TYPE LONG 2 ; 2는 Audio (1은 Video)
RATE FLOAT 44100.0 ; 1초에 44100번 샘플링(CD 샘플링 규격)
WIDTH ULONG 0
HEIGHT ULONG 0
CHANNELS ULONG 2 ; 좌/우 2채널 스테레오
CODEC STRING 'mp3float'
LENGTH DOUBLE 164.75429 ; 노래 길이(초)
COUNT ULONG 7265664
위와 같은 MP3 음원을 읽습니다.
data = read_video(file, 0, /all)
help, data
DATA INT = Array[2, 7264106]
이 중 Left Channel 에 대한 스펙트로그램을 생성해 보겠습니다.
left = reform(data[0, *])
result1 = TS_SPECTROGRAM(left, window=4096, overlap=2048, sample_freq = 44100, freq=freq, time=time)
result2 = bytscl(result1 - max(result1), min=-90, max=0)
i=image(result2, time*2048, freq, rgb_table=75, title='TS_SPECTROGRAM', axis_style = 2, aspect_ratio=0)
두번째 줄에서 TS_SPECTROGRAM을 실행할 때, 앞에 그림으로 설명한 Window Size, Overlap 키워드를 사용합니다. 이렇게 해서 만들어지는 스펙트로그램의 X 축 눈금값(time 키워드), Y축 눈금값(freq 키워드)을 받아낼 수 있습니다. 스펙트로그램은 생성된 것입니다.
세번째 줄은 화면에 표출하기 위한 Scaling 입니다. 이 부분은 표출하는 데이터의 종류, 표출 의도에 따라 달라질 수 있겠지만, 이 예제에서는 음향공학에서 최대 크기를 0dBFS(decibels relative to Full Scale )로 설정하는 관례를 따랐습니다(데이터에서 최대값을 뺐습니다). 16 bit CD 음질이 보통 -96dBFS까지 내려갈 수 있지만, 예제에서는 표출의 최소값을 -90dBFS로 설정하였습니다.
네 번째 줄에서 X 축의 값을 time*2048 로 하였는데, 이는 스펙트로그램에서 한칸 한칸이 원 데이터에서 2048 만큼씩 진행(Window Size - Overlap)하는 것이기 때문입니다.

TS_SPECTROGRAM의 소스코드는 IDL 설치폴더/lib/ts_spectrogram.pro 입니다. 코드가 길지 않으므로, 스펙트로그램을 생성하는 과정을 한번 검토해 볼만 합니다.
위 그림과 같이, 데이터를 일정 크기로 끊어서 FFT를 수행하고, 주파수 별 강도로 변환된 결과를 세워서 쭉 이어 붙인 것이 스펙트로그램입니다.
이 일정 크기(한 마디)를 Window Size라고 하고, 각 Window 간에 중첩을 두어 진행하는데 이를 Overlap 이라고 합니다. 보통은 Window Size의 절반 크기를 Overlap으로 설정합니다.
IDL에서 TS_SPECTROGRAM 함수를 사용하면(TS는 Time Series를 의미합니다), 간단하게 Spectrogram을 생성할 수 있습니다.
----------
file="C:\mysong192.mp3"
ok = query_video(file, streams = strms)
help, strms[0], /struct
** Structure <118eb7f0>, 9 tags, length=56, data length=52, refs=2:
PID LONG 0
TYPE LONG 2 ; 2는 Audio (1은 Video)
RATE FLOAT 44100.0 ; 1초에 44100번 샘플링(CD 샘플링 규격)
WIDTH ULONG 0
HEIGHT ULONG 0
CHANNELS ULONG 2 ; 좌/우 2채널 스테레오
CODEC STRING 'mp3float'
LENGTH DOUBLE 164.75429 ; 노래 길이(초)
COUNT ULONG 7265664
위와 같은 MP3 음원을 읽습니다.
data = read_video(file, 0, /all)
help, data
DATA INT = Array[2, 7264106]
이 중 Left Channel 에 대한 스펙트로그램을 생성해 보겠습니다.
left = reform(data[0, *])
result1 = TS_SPECTROGRAM(left, window=4096, overlap=2048, sample_freq = 44100, freq=freq, time=time)
result2 = bytscl(result1 - max(result1), min=-90, max=0)
i=image(result2, time*2048, freq, rgb_table=75, title='TS_SPECTROGRAM', axis_style = 2, aspect_ratio=0)
두번째 줄에서 TS_SPECTROGRAM을 실행할 때, 앞에 그림으로 설명한 Window Size, Overlap 키워드를 사용합니다. 이렇게 해서 만들어지는 스펙트로그램의 X 축 눈금값(time 키워드), Y축 눈금값(freq 키워드)을 받아낼 수 있습니다. 스펙트로그램은 생성된 것입니다.
세번째 줄은 화면에 표출하기 위한 Scaling 입니다. 이 부분은 표출하는 데이터의 종류, 표출 의도에 따라 달라질 수 있겠지만, 이 예제에서는 음향공학에서 최대 크기를 0dBFS(decibels relative to Full Scale )로 설정하는 관례를 따랐습니다(데이터에서 최대값을 뺐습니다). 16 bit CD 음질이 보통 -96dBFS까지 내려갈 수 있지만, 예제에서는 표출의 최소값을 -90dBFS로 설정하였습니다.
네 번째 줄에서 X 축의 값을 time*2048 로 하였는데, 이는 스펙트로그램에서 한칸 한칸이 원 데이터에서 2048 만큼씩 진행(Window Size - Overlap)하는 것이기 때문입니다.
TS_SPECTROGRAM의 소스코드는 IDL 설치폴더/lib/ts_spectrogram.pro 입니다. 코드가 길지 않으므로, 스펙트로그램을 생성하는 과정을 한번 검토해 볼만 합니다.