<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Moon on River</title>
    <link>https://moononriver.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 10:20:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>강에 뜨는 달</managingEditor>
    <item>
      <title>주절주절 세상에서 제일 늦은 2023년 회고</title>
      <link>https://moononriver.tistory.com/230</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 더 일찍 쓰고 싶었는데 이 제목으로 글을 작성하고 싶은데, 계속해서 사람들이 이런 제목으로 회고를 작성해서 좀만 늦게 써서 히히 내가 제일 늦게 써야지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하다가 결국 지금 쓰게 되었다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아예 할꺼면 2Q에 연말 회고를 하고 3Q에 연초 회고를 하면 세상에서 제일 빠른 연말 회고, 제일 느린 연초 회고를 할 수 있지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이직&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사를 옮기게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 저런 이유로 회사의 내부 사정이 어려워지고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 그건 별로 상관 없는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보고 배울만한 분들이 떠나고 회사 분위기가 전체적으로 축 쳐지는것이 너무 싫었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이직한 회사는 기존 회사랑 많이 다른 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 회사는 돈은 못벌고 기술적인 부분에서는 뛰어났고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현 회사는 돈은 잘 벌지만 기술적인 부분에서 더 나아질수 있는 부분들이 많이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그만큼 성장을 빠르게 많이 했다는 반증이며 할 수 있는 것들이 많다는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;책&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 많이 읽었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 많이는 아니지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 1년간 처음 회사를 다니며 이것저것 배웠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 코드가 무엇인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 대해서 그렇게 치열하게 고민해보진 않았고, 그 점이 아쉬웠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해 읽었던 개발 관련된 책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 클린 아키텍쳐&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 좋은 코드 나쁜 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 오브젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 말해서 그렇게 완전 모든 문장 하나하나를 집중해서 읽진 않았다. 원래 그런 스타일이 아니기도 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 그떄 읽었던 느낌만을 기억하는 편이다. 가끔은 읽는 방식을 바꿔서 읽어보면 다르게 보이지 않을까 하는 생각도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽다보니 드는 생각으로는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 책들에서는 좋은 코드, 설계에 대한 방법론으로 설명을 하지만, 이 개념이&amp;nbsp; 꼭 코드, 시스템 설계에 대해서 국한되는 얘기만은 아니겠다는 생각이 들었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 좋은 OO를 만들기 위한 방법의 일환으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OO에 대한 개념에 제약을 건다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것이 팀의 영역으로 가면 코딩 컨벤션이라던지, 개발적 방법론에 영역에 가면, 함수형, OOP, 등의 방법론을 통해 추구하는 것이 아닐까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 좋은 코드가 무엇이라고 생각하냐는 질문에 OOP를 따르며 SOLID 원칙을 잘 지키는 코드라고 하면 그것은 맞는 말일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OKR처럼 좋은 코드가 가지는 특성이 Object가 되고 OOP-&amp;gt;SOLID 원칙을 준수하는 것은 Key Result여야하지 않을까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 좋은 코드란 무엇일까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 의도와 동일하게 살아있는 코드가 아닐까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살아남았다는건 강하다는 것 Yeah&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 오래 살아남아있다는 것이 좋은 코드인거 같지는 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;죽지 못해 살아있는 코드를 좋은 코드라고 할순 없으니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딱 깔끔하게 죽을 코드는 죽고, 오래 살아있을 코드는 의도대로 살아있는 것이 좋지 않을까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 너무 글이 길어져서 여기까지...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 사람들에게 가치를 만드는 글을 쓰고 싶다는 목표가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 목표를 잡고 귀신같이 티스토리에서 글 쓰는 것을 멈췄다.(..?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 목표가 거창했나...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 연말이 되어서 후다닥 글을 하나 쓰게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kanary159357.github.io/blog/why_use_ref/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kanary159357.github.io/blog/why_use_ref/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709556176094&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Why useRef has different types?&quot; data-og-description=&quot;Let's figure out why useRef has several types in types/react&quot; data-og-host=&quot;kanary159357.github.io&quot; data-og-source-url=&quot;https://kanary159357.github.io/blog/why_use_ref/&quot; data-og-url=&quot;https://kanary159357.github.io/blog/why_use_ref/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://kanary159357.github.io/blog/why_use_ref/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kanary159357.github.io/blog/why_use_ref/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Why useRef has different types?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Let's figure out why useRef has several types in types/react&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kanary159357.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useRef의 type은 왜 이따구로 많은가? 에 대해서 찾아봤다. useRef의 3가지 타입이 어디다 쓰는진 알겠는데, 진짜 의도가 이건지?가 궁금했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 쓰고 싶은건 좀 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Barrel files가 large file webpack 환경에서 얼마나 악영향을 끼치는데 프로파일링하는거 레포랑 글 딱 준비하면 좋을거 같고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNNoise 붙이면서 RNNoise가 뭔데? 그리고 WASM 코드는 왜 이렇게 짰는데? Web Audio의 기초적인것들 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적어도 올해는 위의 내용들은 다 써보면 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 내가 회사에서 올해 뭐했는데?를 문서화하지 못했다. 이것도 근시일내에 까먹기 전에 이력서에 업데이트해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이력서 업데이트하고 1Q 혹은 TF 종료시 업데이트해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전반적인 인생 및 생각에 대한 문서화가 부족한거 같다. 옵시디언에 풀어내보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해보고 싶은 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를 찍어보자 인프런에 크몽에?&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/230</guid>
      <comments>https://moononriver.tistory.com/230#entry230comment</comments>
      <pubDate>Mon, 4 Mar 2024 21:49:38 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm Step 6: Best local estimate</title>
      <link>https://moononriver.tistory.com/228</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;식 1~6에서는 추정치가 아정적이고 기본 주기의 시간 척도에 따라 변동하지 않도록 해주는것임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 변동하면 이건 제대로 했다고 보기 어려움. Tt가 시간 t에 대한 추정치라고 할때 d'(Tt)의 비교적 높은 값과 일치하는 주기의 특정 단게에서 이런 일이 일어나는 경우가 있음. 다른 단계(time t`)에서 추정치가 정확하고 d'(Tt`)도 더 작을 수 있음. Step 6에서는 이 사실을 기반으로 더 나은 추정치를 위해 분석 지점을 '쇼핑'함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 인덱스 t에 대해서 d`(T)에 대한 최소값을 구함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UmRRT/btsni7PCxHR/DuPUsmyTbMVrkS7oUof6LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UmRRT/btsni7PCxHR/DuPUsmyTbMVrkS7oUof6LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UmRRT/btsni7PCxHR/DuPUsmyTbMVrkS7oUof6LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUmRRT%2Fbtsni7PCxHR%2FDuPUsmyTbMVrkS7oUof6LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;106&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; Tma는 최대 예측 주기임.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 추정치를 기반으로 검색범위를 제한해서 추정 알고리즘을 적용해서 최종 예측값을 정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 구현하려고&amp;nbsp; 했었는데, 이미 구현된것들이 너무 많고, 이미 구현된거 디테일에서도 논문만 봐서는 몰랐을 것들이 많아서, 해당 코드를 뜯어보고 논문을 정리하면 좋을거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 LaTex를 배워야지 티스토리에서 정리된 글을 쓸 수 있을거 같다.&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/228</guid>
      <comments>https://moononriver.tistory.com/228#entry228comment</comments>
      <pubDate>Tue, 11 Jul 2023 23:12:33 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm: Parabolic interpolation</title>
      <link>https://moononriver.tistory.com/227</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주기가 샘플링 주기의 배수일 경우 이전 방법이 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않다면 샘플링 기간의 절반까지 부정확할 수 있음. 최악의 경우 dip에서 샘플링된 d'(r)의 값이 클수록, dip사이에서 선택하는 과정에 간섭할수 있고 gross error가 발생할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parabolic interpolation으로 해결할 수 있음(포물선 보간?)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;보간은 두 점을 연결하는 방법. 포물선 보간은 직선으로 두 점을 연결하는게 아니라 포물선 형식으로 두 점을 연결함. (선형 보간이라고 따로 있음)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d'(r)의 지역 최소값과 근처를 포물선으로 맞추고, interpolated(보간)된 최소값을 dip-selection 과정에 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택된 최소값의 횡자표가 주기 추정치가 됨. 이렇게 얻은 추정치는 약간 편향되어있음. 이런 편향성을 피하기 위해서 raw difference function d(r)의 최소값이 대신 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보간을 사용하는것은 업샘플링하는거보다 저렴하고, d(t)가 dip 근처의 4차함수로 모델링될수 있다는 전제하에 정확함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ACF는 파워 스펙트럼의 푸리어 변환이라 신호가 대역제한이 있으면 ACF도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ACF는 코사인의 합으로 테일러 급수로 0에 가깝게 근사화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 주기 피크는 제로 지연 피크(zero-lag peak)와 동일한 모양을 가지며 d(t)의 주기 딥과 모양이 같고, d'(r)과 유사함. 따라서 딥에 대한 포물선 보간은 강하고 높은 주파수가 나오지 않는 이상 정확함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보간은 오류율에 그렇게 영향은 없었음. F0가 샘플링레이트에 비해 작았기 떄문. 합성자극을 테스트에서는 모든 F0에서 약간의 오류를 감소시키고 높은 F0에서 gross error를 방지하는 것으로 나타남.&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/227</guid>
      <comments>https://moononriver.tistory.com/227#entry227comment</comments>
      <pubDate>Sat, 8 Jul 2023 14:47:42 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm : Step 4: Absolute threshold</title>
      <link>https://moononriver.tistory.com/226</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oj9Qp/btsmtCQyFQf/9FufjxblbmzKH5hKiL3laK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oj9Qp/btsmtCQyFQf/9FufjxblbmzKH5hKiL3laK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oj9Qp/btsmtCQyFQf/9FufjxblbmzKH5hKiL3laK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foj9Qp%2FbtsmtCQyFQf%2F9FufjxblbmzKH5hKiL3laK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;600&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림처럼 higher order dip이 period dip보다 긴 경우가 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 범위에 속하면 &quot;octave error&quot;라고 하는 subharmoic error가 됨. Autocorrelation method도 비슷하게 higher order peak를 선택하기 쉬움.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제안하는 방법은 절대 임계값을 설정하고, 그 임계값보다 최소 d만큼 더 적은 제일 작은 값 r을 선택하는거임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택된게 없으면 전역 최소값을 선택함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 threshold가 0.1이면, 에러가 1.69-&amp;gt;0.78로 줄어들음. too&amp;nbsp; low errror가 줄고, too high error가 약간 늘음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Threshold는 집합에 허용되는 후보들을 걸러주며, 주기적 신호가 견딜수 있는 비주기적 파워에 대한 비율로 볼 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEpIGC/btsmscx7c6W/uwZDC1Un11KWtkQg66Mbf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEpIGC/btsmscx7c6W/uwZDC1Un11KWtkQg66Mbf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEpIGC/btsmscx7c6W/uwZDC1Un11KWtkQg66Mbf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEpIGC%2Fbtsmscx7c6W%2FuwZDC1Un11KWtkQg66Mbf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;90&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 식을 window에 대해 평균을 내고 4로 나누면 이렇게 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ5kmw/btsmmQC9MBB/4uSAPv4EWg99fTnKmSARVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ5kmw/btsmmQC9MBB/4uSAPv4EWg99fTnKmSARVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ5kmw/btsmmQC9MBB/4uSAPv4EWg99fTnKmSARVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ5kmw%2FbtsmmQC9MBB%2F4uSAPv4EWg99fTnKmSARVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;448&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측의 두번쨰 항은 신호가 T 주기를 가지면 0이 됨. 따라서 그 주기의 다른 periodic component를 추가하던 빼던 안변함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 신호 파워의 비주기적 파워 컴포넌트로 볼 수 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;왜냐하면 주기 T의 컴포넌트를 더하거나 빼도 어차피 0이기 떄문(따라서 비주기적인 주기를 가진 신호에만 영향을 받음)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step 3에서 썼던 공식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMSVRa/btsmsAyY4AV/GLj8bgxLrFP3bk8vmWVQxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMSVRa/btsmsAyY4AV/GLj8bgxLrFP3bk8vmWVQxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMSVRa/btsmsAyY4AV/GLj8bgxLrFP3bk8vmWVQxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMSVRa%2FbtsmsAyY4AV%2FGLj8bgxLrFP3bk8vmWVQxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1058&quot; height=&quot;230&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r=T일때, 분자인 d(r)은 비주기적인 값에 비례하고, 분모는 0-T사이 d(r)의 평균이므로, 대략적으로 signal power의 2배정도 되는 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;분모가 d(r)의 평균인게 signal power의 2배가 되는건 이게 수학적인건지 아니면 측정이 그런건지?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 d'(r)은 비주기적 신호 파워/전체 신호 파워 라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T는 이 threshold가 기준 이하면 허용된다. 실제 threshold의 정확한 값이 그렇게 큰 영향은 없음.&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/226</guid>
      <comments>https://moononriver.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 5 Jul 2023 00:25:38 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm Step 3: Cumulative mean normalized difference function</title>
      <link>https://moononriver.tistory.com/225</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJApj/btslbxRjHNL/cVp08u5Ho58ZxwhQx4A7vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJApj/btslbxRjHNL/cVp08u5Ho58ZxwhQx4A7vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJApj/btslbxRjHNL/cVp08u5Ho58ZxwhQx4A7vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJApj%2FbtslbxRjHNL%2FcVp08u5Ho58ZxwhQx4A7vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;864&quot; height=&quot;388&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Zero lag에서 Difference Function은 0이지만, 주기성가 불완전할때가 있기에 주기에서는 0이 아닌 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;low limit를 선택하지 않으면 Zero lag dip을 선택하기 떄문에 방법은 실패한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lower limit 설정하더라도 첫번쨰 포먼트에서 강한 공명(resonance) 발생하면, 일련의 이차딥이 발생할 수 있으며, 그것들 중에 하나는 주기 딥보다 깊을수 있음. F1과 F0의 범위가 겹치지기에 lower limit을 거는거는 만족할만한 방법은 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;포먼트가 무엇인가?&lt;br /&gt;말할때 성대에서 발생하는 강한 공명 주파수를 의미함. 말할때 비강, 입, 목구멍을 지나면서 상호연결된 챔버와 튜브 역할을 함. 각 튜브에는 고유한 공진 주파수(resonant frequency)가 존재한다. F1, F2, F3 포먼트 등이 있고, 1이 제일 낮고 3이 제일 높다.&lt;br /&gt;&lt;br /&gt;따라서 Pitch Detection에서 F0의 근본 주파수와 F1의 공진 주파수 범위가 겹치기에 lower limit을 설정하는것 만으로는 제대로 pitch detect를 할수 없다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해답은 difference function을 cumulative mean normalized function으로 대체하는것! (CMNF로 줄여부르는듯) 한국어로 하면 누적평균 정규화 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVGlr4/btslaI6RPMI/ojCCkqZDMSGVxCopjii72k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVGlr4/btslaI6RPMI/ojCCkqZDMSGVxCopjii72k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVGlr4/btslaI6RPMI/ojCCkqZDMSGVxCopjii72k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVGlr4%2FbtslaI6RPMI%2FojCCkqZDMSGVxCopjii72k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;198&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r=0 이면 1,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 이전 값의 더 짧은 지연 값에 대한 평균으로 나누어서 구함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 0이 아닌 1부터 시작하고, d(t)가 평균 이하로 떨어지는 경우에만 1 이하로 떨어짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸로 대체하면 too high error가 감소하여 1.95-&amp;gt; 1.69로 감소함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번쨰 장점은 search range의 주파수 상한을 없애 zero-lag dip을 피할 필요가 없어짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세번째 장점은 다음 스텝을 위해 정규화가 된다는 점.&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/225</guid>
      <comments>https://moononriver.tistory.com/225#entry225comment</comments>
      <pubDate>Tue, 4 Jul 2023 22:51:28 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm: 2. Difference Function</title>
      <link>https://moononriver.tistory.com/224</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCoG9G/btslaedFUII/OL7BKqVCrknIHKYdTIaWTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCoG9G/btslaedFUII/OL7BKqVCrknIHKYdTIaWTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCoG9G/btslaedFUII/OL7BKqVCrknIHKYdTIaWTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCoG9G%2FbtslaedFUII%2FOL7BKqVCrknIHKYdTIaWTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;316&quot; height=&quot;106&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기 T를 가진 신호 x를 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 신호에 대한 제곱을 구하여 평균을 내도 동일하게 0임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p5A3q/btslcCqOSe8/VGIm7AOooK6nMhvuGcxHxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p5A3q/btslcCqOSe8/VGIm7AOooK6nMhvuGcxHxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p5A3q/btslcCqOSe8/VGIm7AOooK6nMhvuGcxHxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp5A3q%2FbtslcCqOSe8%2FVGIm7AOooK6nMhvuGcxHxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;176&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btzn7a/btslghT3DY6/DFlyOc5xAIvszLu9DiaFbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btzn7a/btslghT3DY6/DFlyOc5xAIvszLu9DiaFbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btzn7a/btslghT3DY6/DFlyOc5xAIvszLu9DiaFbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtzn7a%2FbtslghT3DY6%2FDFlyOc5xAIvszLu9DiaFbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;164&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 미분 함수를 통해서 주기를 알아낼수 있음. 당연하게 r이 0이면 주기임. 그리고 이 주기의 배수값만큼 값이 무한대 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNYBi9/btslbo0T6RH/2tDAUtbhcxBVKvD7IBZqe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNYBi9/btslbo0T6RH/2tDAUtbhcxBVKvD7IBZqe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNYBi9/btslbo0T6RH/2tDAUtbhcxBVKvD7IBZqe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNYBi9%2Fbtslbo0T6RH%2F2tDAUtbhcxBVKvD7IBZqe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;110&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제곱합을 확장하여 ACF 형태로 표현할 수 있음(이해못함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 두 항은 에너지 항.&amp;nbsp; 두 항이 상수면 미분함수 d(r)은 r(r) 반대로 변하고, 둘중에 한쪽의 최대값을 구하면 반대쪽의 최소값을 구하는거랑 마찬가지임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 두번쨰 에너지 항도 r에 변해서, r(r)의 최대값과 d(r)의 최소값은 다를수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 unbiased autocorrelation에서 오류율이 10퍼였게 difference function에서 1.95퍼로 낮아짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;-- 생각 --&lt;br /&gt;주기 = 1/f 이니까 pitch detection 알고리즘에서 주기를 구해서 pitch를 구한다. difference function에서 0인거를 구하면 주기가 나오니까, 거기서 음정을 구하는건가? 확인 필요&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 확 변한게 놀라울수도 있는데, 식 1의 방법은 진폭 변화에 너무 예빈함. 시간이 지남에 따라 신호 진폭이증가하면 ACF 피크 진폭이 일정하게 유지되지 않고 lag와 함께 증가함. 이는 고차 피크를 선택하게 하고 &quot;too low&quot; error를 만듦.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1fAHc/btsk9c8vgbA/kqb9Cap0mlUINOyA2zOOlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1fAHc/btsk9c8vgbA/kqb9Cap0mlUINOyA2zOOlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1fAHc/btsk9c8vgbA/kqb9Cap0mlUINOyA2zOOlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1fAHc%2Fbtsk9c8vgbA%2Fkqb9Cap0mlUINOyA2zOOlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;504&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;too low, too high error가 정확히 무슨뜻인지는 모르겠음.. 고차 피크를 선택하는데 왜 too low?&lt;br /&gt;다음 단계에서 이 에러들을 줄인다니까 일단 넘어감&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식2가 진폭에 덜 예민한 함수를 만듦. 그러나 d(r) 사용하는 방식은 식 4의 신호 모델에 밀접하게 기반하고 있으며 &quot;too low&quot; 오류와 &quot;too high&quot; 에러를 잡기 위한 다음 두 오류 단계를 위한 기반을 마련함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cti7dL/btsk9dGnN0u/bRekE85TJ9BsI0MBkA9zJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cti7dL/btsk9dGnN0u/bRekE85TJ9BsI0MBkA9zJ0/img.png&quot; data-alt=&quot;식2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cti7dL/btsk9dGnN0u/bRekE85TJ9BsI0MBkA9zJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcti7dL%2Fbtsk9dGnN0u%2FbRekE85TJ9BsI0MBkA9zJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;184&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;식2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bui30D/btslaHmegBh/i0dWL93SENz1lvu1ZKKcN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bui30D/btslaHmegBh/i0dWL93SENz1lvu1ZKKcN1/img.png&quot; data-alt=&quot;식4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bui30D/btslaHmegBh/i0dWL93SENz1lvu1ZKKcN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbui30D%2FbtslaHmegBh%2Fi0dWL93SENz1lvu1ZKKcN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;106&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;식4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;--생각--&lt;br /&gt;식 4를 이용하는 방법이라, 이 후 나올 방법도 식 4를 사용하기 떄문에 기반이 된다는 의미인듯?&lt;br /&gt;&lt;br /&gt;식2가 식1에 비해 진폭에 덜 예민한 이유는 무엇인가?&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DESKe/btslhdjLbeK/pylZDME3oFWCTo0JhWtI31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DESKe/btslhdjLbeK/pylZDME3oFWCTo0JhWtI31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DESKe/btslhdjLbeK/pylZDME3oFWCTo0JhWtI31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDESKe%2FbtslhdjLbeK%2FpylZDME3oFWCTo0JhWtI31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;596&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2로 계산하면 이렇기 때문.&lt;br /&gt;lag가 커질수록 0에 근접해가는 이유는 큰 r일수록, 당연하게도 더 적은 term이 있기 때문(r이 크다는건 시간 지연이 많다 -&amp;gt; 찍히는 값이 적다&lt;/blockquote&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/224</guid>
      <comments>https://moononriver.tistory.com/224#entry224comment</comments>
      <pubDate>Sat, 24 Jun 2023 17:33:10 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm 1. autocorrelation method -2</title>
      <link>https://moononriver.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tapered ACF envelope가 에러율에 미치는 영향을 평가하기 위해, W=r max인 식2의 결과를 시뮬레이션하기 위해 식1의 함수에서 음의 ramp을 곱하였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApPBt/btskDjd6f1b/lmLxac7b6wHVrvXWBV9Dkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApPBt/btskDjd6f1b/lmLxac7b6wHVrvXWBV9Dkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApPBt/btskDjd6f1b/lmLxac7b6wHVrvXWBV9Dkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApPBt%2FbtskDjd6f1b%2FlmLxac7b6wHVrvXWBV9Dkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1172&quot; height=&quot;236&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doj4cn/btskC4ONEAn/oVkrRRPi2u2epP5ushKEA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doj4cn/btskC4ONEAn/oVkrRRPi2u2epP5ushKEA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doj4cn/btskC4ONEAn/oVkrRRPi2u2epP5ushKEA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdoj4cn%2FbtskC4ONEAn%2FoVkrRRPi2u2epP5ushKEA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;182&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XAr2z/btskAWqJ7Ub/K1Dw0f2zJCG3KT9ukp2Gs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XAr2z/btskAWqJ7Ub/K1Dw0f2zJCG3KT9ukp2Gs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XAr2z/btskAWqJ7Ub/K1Dw0f2zJCG3KT9ukp2Gs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXAr2z%2FbtskAWqJ7Ub%2FK1Dw0f2zJCG3KT9ukp2Gs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;182&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ramp function은 0이하이면 0이고, 그 이상이면 t인 선형 기울기 함수를 의미함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t&amp;nbsp;&amp;ge;&amp;nbsp;0의&amp;nbsp;경우&amp;nbsp;r(t)&amp;nbsp;=&amp;nbsp;t&lt;br /&gt;t&amp;nbsp;&amp;lt;&amp;nbsp;0인&amp;nbsp;경우&amp;nbsp;0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 느낌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ramp_function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Ramp_function&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687186017537&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ramp function - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Graph of the ramp function The ramp function is a unary real function, whose graph is shaped like a ramp. It can be expressed by numerous definitions, for example &amp;quot;0 for negative inputs, output equals input for non-neg&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/Ramp_function&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/Ramp_function&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGhzdF/hyS4pEey9z/KKAsqNmt0a2lGxJ2xVw1fk/img.png?width=1200&amp;amp;height=680&amp;amp;face=0_0_1200_680,https://scrap.kakaocdn.net/dn/eL6Jq7/hyS2JRS7Mu/j7wnxEjwWQ1yg47dgKdLyK/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/v0PcA/hyS2B7mIzT/fMDwiOJaYgpk3uJUjKMSJ1/img.png?width=640&amp;amp;height=363&amp;amp;face=0_0_640_363&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ramp_function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/Ramp_function&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGhzdF/hyS4pEey9z/KKAsqNmt0a2lGxJ2xVw1fk/img.png?width=1200&amp;amp;height=680&amp;amp;face=0_0_1200_680,https://scrap.kakaocdn.net/dn/eL6Jq7/hyS2JRS7Mu/j7wnxEjwWQ1yg47dgKdLyK/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/v0PcA/hyS2B7mIzT/fMDwiOJaYgpk3uJUjKMSJ1/img.png?width=640&amp;amp;height=363&amp;amp;face=0_0_640_363');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ramp function - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Graph of the ramp function The ramp function is a unary real function, whose graph is shaped like a ramp. It can be expressed by numerous definitions, for example &quot;0 for negative inputs, output equals input for non-neg&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Negative ramp는 ramp function의 반대로 시간이 지날수록 선형적으로 감소!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r max 를 사용하면 중간값에 대한 전체 에러를 최소화하면서 하나의 오차를 희생해서 하나의 에러에 편항되게 만들수 있음. 식2를 사용하면 W 크기를 조절해 더 자연스러운 편향을 만들수 있음. Why? 식 2에서 W크기는 r 값과 반비례하기 때문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 W 크기 조절하는게 의미가 크다면, 식2를 써서 암묵적으로 조절하는것보다, 명시적으로 적용하는게 좋음. 이게 식1을 쓰는 이유.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Autocorrelation은 shift된 신호와 비교하며, 그러한 맥락에서 AMDF 방법과 연관이 있고, 각 이벤트간의 간겨글 측정하는 time-domain method와도 연관이 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ACF는 Power Spectrum의 푸리에 변환이며, 스펙트럼 내부의 하모닉스간의 주기적인 간격을 특정하는거임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cepstrum method는 power spectrum을 긴 진폭 스펙트롬으로 대체하며, 스펙트럼의 고진폭 부분에 가중치를 덜 둔다. 비슷하게 Spectral whitening effect는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Linear predictive inverse filtering&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;center-clipiping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터를 여러번 거친 신호를 나누고, 각 채널 내에서 ACF를 산하고 정규화한다음 결과를 더하는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Autocorrelation 기반 방법들은 제일 유명한 방법들임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 향상을 위한 많은 노력들이 있었음에도, 이 방법은 오류가 너무 많음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 에러를 줄이기 위한 여러 스텝들을 고안함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음 스텝부터는 Autocorrlation method를 기반으로 에러를 줄이기 위한 방법들을 소개한다.&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/223</guid>
      <comments>https://moononriver.tistory.com/223#entry223comment</comments>
      <pubDate>Tue, 20 Jun 2023 00:09:43 +0900</pubDate>
    </item>
    <item>
      <title>YIN Algorithm 1. autocorrelation method</title>
      <link>https://moononriver.tistory.com/222</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;잘 아는 분야가 아니라 이해도도 떨어지는데 영어 논문이라 눈에 바로 들어오지도 않아 천천히 정리하고 논문에서 모르거나 많이 설명하지 않고 넘어가는 부분은 추가로 적어가며 정리해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 유명한 pitch detection인 Classic Autocorrelation 방법을 제시하고, 이것의 오류를 분석한 다음 이것의 오류점들을 개선한 것이 YIN 알고리즘.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YIN이란게 동양의 음과 양, autocorrelation과 cancellation간의 상호작용에서 착안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Autocorrelation&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/22aQU/btsjJUF6chO/30xDOlElbWMAKrlFV1tY7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/22aQU/btsjJUF6chO/30xDOlElbWMAKrlFV1tY7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/22aQU/btsjJUF6chO/30xDOlElbWMAKrlFV1tY7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F22aQU%2FbtsjJUF6chO%2F30xDOlElbWMAKrlFV1tY7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;226&quot; height=&quot;106&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discret&amp;nbsp; signal의 ACF는 이렇게 표현된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT3EW0/btsjJaI6X4O/z4xnrh9Gm5UnhhoiwcyOCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT3EW0/btsjJaI6X4O/z4xnrh9Gm5UnhhoiwcyOCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT3EW0/btsjJaI6X4O/z4xnrh9Gm5UnhhoiwcyOCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT3EW0%2FbtsjJaI6X4O%2Fz4xnrh9Gm5UnhhoiwcyOCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;261&quot; height=&quot;87&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 신호처리에서는 이 식을 많이 씀. r이 커질수록 window 크기가 줄고, 함수의 envelop이 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh86gb/btsjILJoTiT/MPeL3uTObI8FbGpsEKS9p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh86gb/btsjILJoTiT/MPeL3uTObI8FbGpsEKS9p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh86gb/btsjILJoTiT/MPeL3uTObI8FbGpsEKS9p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh86gb%2FbtsjILJoTiT%2FMPeL3uTObI8FbGpsEKS9p0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;138&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;envelop은 이것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 식은 t+1 - t+W 사이에 있으면 동일하지만, 그렇지 않으면 다름. 이 논문에서는 다른말 없으면 대체로 첫번쨰 식 씀.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기적 신호의 응답으로, ACF는 주기의 배수에서 peak가 뜸. Autocorrelation method는 lag 범위 내에서 가장 높은 zero-lag 피크를 고르는 방법임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[추가 공부]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신호의 autocorrelation을 구할떄,&amp;nbsp; 원 신호와, delayed, or shifted된 신호와 비교한다. lag는 기존 신호와 비교하기 전에 signal이 얼마나 이동(shifted)했는지를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lower limit이 너무 작으면 zero-lag peak를 고를 가능성이 높아지고, higher limit이 너무 높으면 higher order peak를 고를 가능성이 높아짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[추가공부]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;higher order peak는 더 긴 delay, shift 에 존재하는 피크를 의미한다. 대체로는 zero-lag peak가 제일 높지만, 때떄로 더 높은 lag에서 추가적인 peak가 존재할수 있음. 따라서 lag를 너무 길게 잡으면 이런 higher order peak를 골라버리는 위험이?!&lt;/p&gt;</description>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/222</guid>
      <comments>https://moononriver.tistory.com/222#entry222comment</comments>
      <pubDate>Tue, 13 Jun 2023 00:11:17 +0900</pubDate>
    </item>
    <item>
      <title>TIL 2023-02-14 Reverb Algorithm</title>
      <link>https://moononriver.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://valhalladsp.com/category/learn/plugin-design-learn/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://valhalladsp.com/category/learn/plugin-design-learn/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676384349099&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Plugin Design Archives - Valhalla DSP&quot; data-og-description=&quot;Creative tools for audio workers. Pro plugins for musicians, producers and engineers.&quot; data-og-host=&quot;valhalladsp.com&quot; data-og-source-url=&quot;https://valhalladsp.com/category/learn/plugin-design-learn/&quot; data-og-url=&quot;https://valhalladsp.com/category/learn/plugin-design-learn/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rt5wl/hyRCWLgls1/QAKjeKYROk3GNKwLjc3qyK/img.png?width=267&amp;amp;height=33&amp;amp;face=0_0_267_33&quot;&gt;&lt;a href=&quot;https://valhalladsp.com/category/learn/plugin-design-learn/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://valhalladsp.com/category/learn/plugin-design-learn/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rt5wl/hyRCWLgls1/QAKjeKYROk3GNKwLjc3qyK/img.png?width=267&amp;amp;height=33&amp;amp;face=0_0_267_33');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Plugin Design Archives - Valhalla DSP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Creative tools for audio workers. Pro plugins for musicians, producers and engineers.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;valhalladsp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리버브 알고리즘을 어떻게 짜는지 하나도 모르는 상황에서 찾아보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가성비 플러그인으로 유명한 발할라 DSP에서 관련된 내용들과 추천 논문들이 있는데 이거 천천히 읽어보자&lt;/p&gt;</description>
      <category>ETC</category>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/221</guid>
      <comments>https://moononriver.tistory.com/221#entry221comment</comments>
      <pubDate>Tue, 14 Feb 2023 23:20:08 +0900</pubDate>
    </item>
    <item>
      <title>TIL 2023-02-12 Chrome Extension TabCapture 관련 삽질</title>
      <link>https://moononriver.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;V3 Manifest기준으로는 Chrome tab catpure가 background 페이지에서 작동하지 않는 변경점이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Background가 Service worker로 변했는데, 이로 변경하면서 Service worker에서는 DOM으로의 접근을 막아 보안성을 높이려 한거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이런 변경점 떄문에 기존에 크롬의 탭에 대한 내용을 가져올 수 있던 chrome.tabCapture API가 백그라운드에서는 작동하지 않게 되었고, 이에 따라 다른 방법을 찾을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. inactive인 탭을 만들어 거기서 capture하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒷단이 아닌 앞단에서의 tabCapture는 막히지 않았기 때문에, tabCapture을 생성할 임의의 탭을 생성해서, 여기서 tabCapture 이벤트에 관한 내용을 처리하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 작동은 한다. 문제는 inactive한 tab 하나가 띡 나와버리는 것이다. UI적으로 굉장히 이쁘지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 예제로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/zhw2590582/chrome-audio-capture&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/zhw2590582/chrome-audio-capture&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676211895195&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - zhw2590582/chrome-audio-capture: Chrome Audio Capture&quot; data-og-description=&quot;Chrome Audio Capture. Contribute to zhw2590582/chrome-audio-capture development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/zhw2590582/chrome-audio-capture&quot; data-og-url=&quot;https://github.com/zhw2590582/chrome-audio-capture&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yBWwa/hyRAfY619G/nZpoKBz6S0qtaaH88AIkyk/img.png?width=1200&amp;amp;height=600&amp;amp;face=1001_138_1059_201&quot;&gt;&lt;a href=&quot;https://github.com/zhw2590582/chrome-audio-capture&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/zhw2590582/chrome-audio-capture&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yBWwa/hyRAfY619G/nZpoKBz6S0qtaaH88AIkyk/img.png?width=1200&amp;amp;height=600&amp;amp;face=1001_138_1059_201');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - zhw2590582/chrome-audio-capture: Chrome Audio Capture&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Chrome Audio Capture. Contribute to zhw2590582/chrome-audio-capture development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 레포가 있어 테스트를 해보았는데 크롬 익스텐션에서 저런게 뜨면 썩 달가운 사람은 없을거 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 포기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. content.js에 tabCapture 관한 내용을 물려받게 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content 자체는 chrome의 몇몇 API를 제외한 나머지 API들은 모두 막혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 popup 등에서 tabCapture를 한 뒤, 이에 대한 media stream 내용을 content에 넘겨줘서 사이트에 주입시켜주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이것은 내가 하려는 것과는 맞지 않는다. 왜냐하면 이런 방식을 통한다면 특정 액션 주입을 할떄 무조건 팝업을 거쳐야하기 떄문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 한가지 문제점이 더 있었는데, capture을 할떄, 항상 유저에게 권한을 물어본다는 것이다. 이것도 UI적으로 맞지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #e3e6e8; color: #232629;&quot;&gt;--auto-select-desktop-capture-source&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬에 CLI상으로 이렇게 넣어주면 되는데, 익스텐션을 편하려고 쓰는거지 누가 CLI 까지 넣어가며 익스텐션을 쓰나...(어차피 구성하려는 것과 차이도 있지만)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 문제는 V3 Manifest로 변환할떄 Service Worker로 바꾸면서, 기존 V2 기능들을 커버하지 못하게 짠게 문제인 것이다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해서 V3에서는 offscreen이라는 chrome API가 새로 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤드리스 브라우저처럼 아예 안보이는 브라우저 탭 비스무리하는 것을 생성해주는 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/reference/offscreen/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.chrome.com/docs/extensions/reference/offscreen/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676212565436&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;chrome.offscreen - Chrome Developers&quot; data-og-description=&quot;Build the next generation of web experiences.&quot; data-og-host=&quot;developer.chrome.com&quot; data-og-source-url=&quot;https://developer.chrome.com/docs/extensions/reference/offscreen/&quot; data-og-url=&quot;https://developer.chrome.com/docs/extensions/reference/offscreen/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1JG65/hyRAbCrKtI/a6KuTOk2atczaX21Y77udk/img.png?width=1521&amp;amp;height=1521&amp;amp;face=0_0_1521_1521,https://scrap.kakaocdn.net/dn/eWBCv/hyRAmKHjbz/QFEyl6mWqkdAHW0KJG9mmk/img.png?width=1521&amp;amp;height=1521&amp;amp;face=0_0_1521_1521&quot;&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/reference/offscreen/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.chrome.com/docs/extensions/reference/offscreen/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1JG65/hyRAbCrKtI/a6KuTOk2atczaX21Y77udk/img.png?width=1521&amp;amp;height=1521&amp;amp;face=0_0_1521_1521,https://scrap.kakaocdn.net/dn/eWBCv/hyRAmKHjbz/QFEyl6mWqkdAHW0KJG9mmk/img.png?width=1521&amp;amp;height=1521&amp;amp;face=0_0_1521_1521');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;chrome.offscreen - Chrome Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Build the next generation of web experiences.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.chrome.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 얘도 content처럼 Chrome API에 대해서 굉장히 제한적인 접근 권한이 있어 똑같이 tabCapture에 대해 접근할 수 없다는 것...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나와 같은 상황인 사람들이 생각보다 많은거 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676212697099&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Offscreen documents API should allow access to chrome.tabCapture API&quot; data-og-description=&quot;Juraj M. 읽지 않음, 2022. 9. 3. 오전 2:51:1022. 9. 3.  작성자에게 답장하려면 로그인하세요. 전달하려면 로그인하세요. 이 그룹의 메시지를 삭제할 권한이 없습니다. 메시지를 악용사례로 신고하려&quot; data-og-host=&quot;groups.google.com&quot; data-og-source-url=&quot;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&quot; data-og-url=&quot;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://groups.google.com/a/chromium.org/g/chromium-extensions/c/Ekw1nYHyiO8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Offscreen documents API should allow access to chrome.tabCapture API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Juraj M. 읽지 않음, 2022. 9. 3. 오전 2:51:1022. 9. 3.  작성자에게 답장하려면 로그인하세요. 전달하려면 로그인하세요. 이 그룹의 메시지를 삭제할 권한이 없습니다. 메시지를 악용사례로 신고하려&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;groups.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&quot;&gt;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1676213078905&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1214847 - 
 
 
 chromium -
 
 
 An open-source project to help move the web forward. - 
 
 Monorail&quot; data-og-description=&quot;&quot; data-og-host=&quot;bugs.chromium.org&quot; data-og-source-url=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&quot; data-og-url=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1214847&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1214847 - chromium - An open-source project to help move the web forward. - Monorail&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bugs.chromium.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;1209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNZixJ/btrYT8y9PHP/Io0BQzdIFwz3WqufKsW2uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNZixJ/btrYT8y9PHP/Io0BQzdIFwz3WqufKsW2uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNZixJ/btrYT8y9PHP/Io0BQzdIFwz3WqufKsW2uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNZixJ%2FbtrYT8y9PHP%2FIo0BQzdIFwz3WqufKsW2uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;1209&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;1209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 MV2에서 MV3로 2023년 1월에 다 넘겨버리고 MV2 지원 중단한다고 해놓고 무기한 연기를 한게 아닌거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 그렇다고 지금 MV2로 개발하는것도 에바고....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 2안으로 어떻게 할거냐면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지를 만드는 것으로 변경함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차적으로 지원가능한 기능으로는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플러그인 형식으로 쌓을수 있는 형식이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 오디오를 Input으로 넣을수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도로 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원할 기능 첫번쨰는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Volume&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Compressor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EQ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인거 같은데 사실 구현자체는 Web API에서 다 구현해놔서 디자인을 좀 이쁘게 해볼까....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 신스도 만들어보고 싶은데 한번 있는지 확인해봐야겠따.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 블로그 만들어야하는데 Jekyll 테마 따봉 박아놓은거 내일 포크해서 만들자&lt;/p&gt;</description>
      <category>TIL</category>
      <author>강에 뜨는 달</author>
      <guid isPermaLink="true">https://moononriver.tistory.com/220</guid>
      <comments>https://moononriver.tistory.com/220#entry220comment</comments>
      <pubDate>Sun, 12 Feb 2023 23:49:35 +0900</pubDate>
    </item>
  </channel>
</rss>