오늘 시간이 좀 나서 스펙트로 그램으로 몇 가지 실험을 해 보았습니다.
이게 무슨 의미가 있을까? 관심 가지는 분들이 있기나 할까 싶기도 하지만,
그래도 혹, 흥미를 느끼시는 분이 있을 것 같기도 하여 실험결과를 올려 봅니다.
실험의 목적
48kHz 샘플링된 음원과 96kHz 샘플링된 음원의 낮은 주파수 대역(20kHz 이하 대역)에서 정보량의 차이를 확인하기 위함.
실험1)
실험방법
1. 24/96kHz 샘플링 음원 준비(1번음원)
https://drive.google.com/open?id=1XCAPxKgGebumZR9MxvR_cJ04mDw4pg5y
링크를 클릭하면 실험에 사용한 음원을 다운 받으실 수 있습니다.
2. 24/96k 음원을 24/48kHz 샘플링 레이트로 다운(2번음원)
다운 방법은 어도비 오디션에서 24bit 48kHz 샘플레이트로 다운샘플링(No Dithering)
https://drive.google.com/open?id=1yPNMFhulWnUZ7H2S-_jV9A5VOv-vQ0xX
3. 24/48kHz로 다운샘플링된 음원을 다시 24/96kHz로 업샘플링(3번음원)
원본과 동일한 스케일로 스펙트로그램을 확인하기 위함.
https://drive.google.com/open?id=1g2ewgvgYEKnNX28n6l9dL98Hy7pT4GKm
1번에서 2번을 수행하는 과정에서 24kHz 이상의 대역 정보는 모두 사라지지만
24kHz 대역 근처의 경계에서는 다운샘플러 필터의 특성에 따라서 차이가 있을 수 있으나 대부분의 정보는 유지 되고, 다시 업샘플링 하다고 하여 낮은 대역내의 정보량이 증가하지는 않을 것이므로 96kHz 샘플과 48KHz 샘플의 대역내 정보를 비교할 수 있게 됩니다.
4. 오디션에서 1번 음원과 3번 음원의 스펙트로그램을 비교 확인
1번음원(96kHz 샘플링)의 스펙트로그램
https://drive.google.com/open?id=1mfxF0S2Z5OyjtsWkodphRngGlhMHXGTD
3번음원(48kHz 다운샘플링 후 96kHz로 업샘플링)의 스펙트로그램
https://drive.google.com/open?id=1M44FwRFsSYddtzH6fjk7svZgASyBPFC0
비교결과 24kHz 이상 대역에 정보가 있고 없음의 차이 이외에는 그래프를 육안으로 유의미한 차이 발견 하지 못하였습니다.
실험2)
위의 실험에서 오디션 프로그램 내부에서 어떤 파라미터를 가지고 계산되는지를 알 수 없고,
또한, 48 -> 96 업샘플링 과정에서 대역내(24KHz 이하) 정보량이 증가 했다는 혹 있을 억측을 해소하고,
좀 더 세밀한 비교를 위해 MATLAB 으로 직접 파라미터를 설정하면서 spectrogram을 플로팅 해 보았습니다.
Matlab 에서는 Y-축(주파수 축)의 스팬을 임의로 조절 할 수 있기 때문에 3번샘플(96k -> 48k -> 96k 변환된 샘플)을 사용하지 않고 원본인 96k 샘플과 다운샘플링된 2번 샘플로 비교해 보았습니다.
아래 두 그림에서 차이점을 한번 찾아 보시기 바랍니다.
그리고 어느 그림이 96k 샘플이고 어느 그림이 48k 샘플인지 한번 추측해 보시기 바랍니다. 그리고 왜 그렇다고 생각 하시는지 이유를 함게 말씀해 주시면 감사하겠습니다.
세밀한 비교 확인을 해 보실 분을 위해 bmp 파일을 함께 첨부 합니다.
Sample A
https://drive.google.com/open?id=1lFm8klmcr2CmEObInwvzWpZiG7XuvGn4
Sample B
drive.google.com/open
계산에 사용된 matlab 코드와 주석은 아래와 같습니다.
[y96,Fs] = audioread('Adagio_24_96K.wav'); %96k 음원 로드
[y48,Fs48] = audioread('Adagio_24_48K.wav'); %48k 음원 로드
y96L = y96(:,1); %96k 스테레오 음원에서 Left 음원만 추출
y48L = y48(:,1); %48k 스테레오 음원에서 Left 음원만 추출
[s48,w48,t48,p48] = spectrogram(y48L(1:50000),5000,4900,[],Fs48,'yaxis');
% 48k 샘플 주파수축 배열을 얻기 위한 계산 수행
spectrogram(y48L(100000:200000),5000,4900,w48,Fs48,'MinThreshold',-120,'yaxis');
% 48k 샘플을 10만번째 샘플부터 20만번째 샘플까지에 대해서
% 5000 샘플크기의 윈도를 취해서 fft를 수행하고 다음 윈도에서 이전 윈도와
% 4900 샘플을 중첩시킴
% -120dB 이하는 컷 하여 버림.
spectrogram(y96L(200000:400000),10000,9800,w48,Fs,'MinThreshold',-120,'yaxis');
% 96k 샘플을 20만번째 샘플부터 40만번째 샘플까지에 대해서
% 1만 샘플크기의 윈도를 취해서 fft를 수행하고 다음 윈도에서
% 이전 윈도와 9800 샘플을 중첩시킴
% -120dB 이하는 컷 하여 버림.
% 96k 샘플과 48k 샘플을 동일한 시간축에 놓고 비교 하기 위해서
% 계산에 사용된 샘플의 수를 2배수로 맞추고, fft 윈도크기도 2배수로 맞춤
matlab을 사용하실 줄 아시는 분들은 한번 해 보시고 혹 실험과정의 문제나 해석을 달리 하는 부분이 있으면 조언 주시면 감사히 수용하겠습니다.