제기랄 글 열심히 쓰고 있었는데 날라가서 다시 써요 ㅠ

STFT 에 관해 포스팅 한 것이 벌써 2주가 지났네요 ㅋㅋ

 

예고한대로 오늘은 STFT 를 이용해서 아이유-좋은날의 3단부스터 부분을 분석해 보도록 하겠습니다 ㅋㅋ

저는 노래 듣다가 아이디어가 떠올라서 한번 해보자 라는 생각이였는데 이미 이것을 하신분이 있더라구요 ㅋㅋ

하지만 그분은 신호처리부분을 강하게 다루지 않으셨기에, 저는 Matlab 코드와 신호처리쪽에 초점을 맞추어

STFT 포스팅을 마무리 하려 합니다. ㅋㅋ

 

일단 항상 이런 프로젝트를 시작하기에 앞서서 계획을 세우는 것이 중요하지요

이렇게 할 경우에 내가 어디까지 진행되었는지, 얼마나 남았는지 등등을 한눈에 알아 볼수 있어서, 적게 헤매게 되는 것 같아요

 

 

 

프로젝트 명 : Adative Filter (LMS) 를 이용한 MR 제거 및 STFT 를 이용한 음계 분석

목적 : 1. STFT 의 기능구현 검증

2. 지금까지 공부한 개념들의 총괄적인 적용 및 확인

3. 나의 재미

프로젝트 목표 : 최후의 STFT 결과가 실제 악보의 음정과 얼마나 일치 하는지 비교

준비물 : 1. 아이유 – 좋은날 mp3 파일

     2. Wav file 로 변환 할 소프트웨어 or mp3 파일을 matlab 에서 인식 시킬 수 있는 함수

     3. 아이유 – 좋은날 악보

     4. 피아노 음계의 주파수 영역 정보

     Final. 포기하지 않는 끈기와 열정, 근성 (이게 젤로 중요함!!!)

진행과정

  1. 아이유 – 좋은날 mp3 음원파일 다운로드: (도시락에서 합법적으로 다운로드했어요 ㅋㅋ)
  2. 3단 부스터 영역 확인 : 3분 25초 ~ 3분 40초 데이터 (직접 귀로 확인 ㅋㅋ)
  3. Matlab 을 이용하여 PCM 신호에서 MR 신호를 뽑아내고 Stereo 로 저장
  4. Adaptive Filter (LMS) 를 이용하여 Matlab에서 Vocal File 생성
  5. Left , Right 각각의 Mono Signal 을 뽑아내고 서로 합쳐주어서 Stereo File 로 저장

 

 

요로코롬 계획을 세웠습니다 ㅋㅋ 그럼 시작해 볼깝숑? ㅋㅋㅋ

 

일단 아이유 – 좋은날의 3단 부스터 영역을 잘라서 wav 파일로 저장하기 위한 프로그램이 필요하겠죠? ㅋㅋ

그 이름도 유명한 GoldWave 를 사용하였습니당 ㅋㅋ

 

 

<Figure1. GoldWave Layout>

 

오!!! 보라!!! ㅋㅋ 이 웅장한 자태를 ㅋㅋㅋ

스테레오라서 이렇게 2라인으로 나와용 ㅋㅋ

여기서 3분 25초에서 3분 40초 데이터를 잘라서 wav 로 Save As 하면 되겠지용? ㅋㅋ

 

다음으로 MR 을 뽑아내야 합니다.

대부분의 음악 파일들은 Stereo 로 저장되어 있어요

즉 왼쪽, 오른쪽으로 흘러나오는 소리를 따로 기록해 놓았단 의미로 해석할수 있어요 ㅋ

하지만!!! 여기서 차이점은 ㅋㅋ

  1. 음성 신호는 In Phase 로 저장한다
  2. MR 은 Out of Phase 로 저장한다 ㅋㅋ

자… 감이 오시지요? ㅋㅋ

스테레오 PCM 신호에서 왼쪽에서 오른쪽 신호를 빼버리거나, 오른쪽에서 왼쪽 신호를 빼주면

음성 신호는 동위상이라 제거 되고 MR 만 남게 되는 것입니다 ㅋㅋ

생각 보다 쉽지요??

%% PCM 파일 로드

[data,fs,bit] = wavread('booster.wav');

 

%% MR 생성

mr = data(:,1)-data(:,2);

mrs = [mr mr.*(-1)]; wavwrite(mrs,fs,bit,'booster_mr.wav');

wavwrite(mrs,fs,bit,'booster_mr.wav');

 

자 그럼 mono 형태의 MR 을 얻게 될것이에요 ㅋㅋ

그걸 스테레오로 바꿀려면?? 위에서 설명한 개념을 반대로 수행하면 되겠죠? ㅋㅋ

위의 MATLAB 코드 참조하세요 ㅋㅋ

그럼 이제 Adaptive Filter 를 써서 원래 신호에서 우리가 얻은 MR 을 제거하고 목소리만 강조된

데이터를 얻어내면 되겠네요 ㅋㅋ

 

Adaptive Filter 의 경우 잘 모르면 그냥 넘어가세요 ㅋㅋ 궁금하신분들 코드 보시구요 ㅋ

<Figure2. Adaptive Filter 기본 블록도>

 

대충 이런 개념인데… ㅋ 흠.. ㅋㅋ 여튼 우리가 하고자 하는 것은 STFT 이니까요 ㅋㅋ

적응필터에 대해서 공부하는 것은 다음기회에 포스팅을 할께요 ㅋㅋ

 

이렇게 해서 MR 뺀 쌩목소리 버전을 뽑았습니다 ㅋㅋ

하지만!!! 이렇게 한다고해서 배경음악이 다 빠지는 것은 아니에요 ㅋㅋ

다만 목소리 부분이 아주 크게 강조가 되었을 뿐 ㅋㅋ 들리긴 들리더라구요 ㅋㅋ

 

시중에 돌아다니는 MR 제거 프로그램이 있어서, 그 프로그램으로 뽑은 파일과

제가 만든 파일을 비교해 보았는데 크게 차이가 없어요 ㅋㅋ

파일 올려드릴 테니 비교해 보세요 ㅋㅋ

 

<Figure3. MR 제거해주는 쪽바리 프로그램 ㅋ>

제 귀에는 두개 다 얼추 비슷하게 들렸습니다 .ㅋㅋㅋ

 

이제 STFT 할 차례 ~ ㅋㅋ

 

<Figure4. STFT MATLAB 코드>


쿨하게 코드부터 떄려놓고 가겠습니다 ㅋㅋ

포스팅 1,2,3번을 보신분들은 코드가 이해가 가실거라 믿어요 ㅋㅋ

 

파라미터들은 3번 포스팅에서 말씀드렸듯이, 시행착오를 거쳐가며 얻어냈습니다.

다만, 이때 고려해줄수 있는 사항은 아이유가 부스터를 쓸 때 최소 1초 이상은 질러

주는 것 같으니까 이부분을 고려서 Time Resolution을 결정할 수 있다는거죠 ㅋ

STFT 를 너무 빡세게 해버리면 훗날 그래프 볼 때 힘드니까 잘 결정하세요 ㅋㅋ

 

고로!!! 좋은 CPU 와 좋은 GPU 가 있어야 연구도 잘한다!!!

 

 Figure 5. STFT Spectrogram

아… 망할 스팩트로그램 ㅋㅋ 당최 무슨소린지 알수가 없습니다 ㅋㅋ

 

이따위로 나와서 포기하면… 안되요 ㅋㅋㅋ

인간의 목소리가 낼 수 있는 주파수 영역대를 찾았어요 ㅋ

300Hz ~ 3.4kHz 까지 낼 수 있더군요.

아이유가 부스터 쓰는 음이 300Hz 보다는 높을거라는 생각이 들더군요

잠시뒤에 자세히 말씀드리겠지만, 우리가 흔히 생각하는 1옥타브 '라' 가 440Hz

이구요, 이 주파수가 기준 주파수가 되어 반음 올라갈때마다 배씩

올라가요 ㅋㅋ

그래서 500 Hz 부터 1kHz 까지 봐보자! 라고 생각한 것입니다 ㅋㅋ

 

자 그럼.. 그림 나갑니다 ㅋㅋ

 

 

Figure 6. STFT 결과 Mesh Graph

 

오 뭔가 보이는 것 같지요??? ㅋㅋ

그럼 좀더 선형적으로 보기위해서 Contour 때려볼까요? ㅋㅋ

 

Figure 7. STFT 결과 Contour Graph

 

야호~ ㅋㅋㅋ

3단 부스터를 쓰는 부분이 아주 딱 들어 맞네요? ㅋㅋ

해당 주파수를 구해서 음계를 구해서 써놓고 아이유 좋은날 악보를 찾아서 부스터 부분 음계를 구해

비교할 일만 남았습니다.

1단 : 659.45Hz

2단 : 698.48Hz

3단 : 738.86Hz

의 주파수를 갖고 있군요 ㅋㅋ 와 이렇게 길게 소리를 내면서 음이 흔들리지 않았다니 ㅋㅋ

아이유 너 노래좀 잘하는구나? ㅋㅋㅋ

 

여튼, 이제 저 주파수가 피아노 음계의 어떤 음에 해당하는지 볼까요? ㅋ

 

     Figure 8. 피아노 음계의 주파수

 

위에서 잠깐 말씀드린 것 처럼, 1옥타브 '라' 가 440Hz 로 기본이 되용 ㅋㅋ

여기서 반음 올라갈때마다 배씩 증가 한답니다 ㅋㅋ

그래서 주욱 주파수를 구해서 써봤어요 ㅋㅋ

우리가 흔히 생각하는 2옥타브 미, 파, 파# 의 음계를 불렀다고 공학적으로 유추할수 있군요

 

그럼 악보를 찾아서 비교해 볼까용? ㅋ

 

Figure 9. IU 좋은날 악보

짜안~ ㅋㅋㅋ

부스터 부분에 제가 가사를 썼습니다 ㅋㅋ

오.. 앞쪽에 #이 세개나 붙은 악보군용 ㅋㅋ

그럼 샵 플랫 관계 잘 생각하면서 계이름 읽어보니!!!

 

앗!! 2옥타브 미, 파, 파# 으로 정말 정확하게 일치하는군요!!!

와 간지다 진짜 ㅋㅋㅋ

아.. 글을 졸라 쓸라니까 힘드네 ㅋㅋ

 

원래는 코드도 다 올릴려고 했지만 힘든 관계로 m-file 로 첨부합니다 ㅋㅋ

궁금하신분들은 다운로드 받아서 한번씩 해보세요 ㅋㅋㅋ

 

코드 전문과 제가 잘라놓은 파일들을 첨부할 테니까 한번씩 해보시면 잼있을거에요 ㅋㅋ
이 전 과정을 문서화 해놓은 PDF 파일도 첨부합니다

이걸로서 앞서 3개의 포스팅에서 설명한 STFT 방법에 대해 감이 오셨을 거라고 생각되네요 ㅋ

 긴 글 읽느라 수고 많으셨습니다 ㅋㅋㅋ

그럼 즐거운 코딩, 즐맷랩 되세요 ㅋㅋㅋ

 

프로젝트 결과물

  1. IU.m
  2. STFT&IU.pdf
  3. Booster.wav : 3단 부스터 쓰는 부분만 캡쳐함
  4. Booster_mr .wav : Matlab 을 이용해 MR 만 뽑아낸 파일
  5. Booster_vocal.wav : Adaptive filter 를 이용해 목소리만 뽑아낸 파일
  6. Boost_vocal.wav : 상용화된 쪽바리 프로그램으로 MR 제거한 버전 (비교용)
    (눼미, 이거 파일용량 때문에 따로 올려드릴께요 ㅋ)


     

Posted by J.Bear