<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Record</title>
    <link>https://5daeng.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 24 Sep 2026 23:51:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bangboo__</managingEditor>
    <item>
      <title>Pandas- DataFrame.loc &amp;amp;  .iloc</title>
      <link>https://5daeng.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;판다스에서 많이 사용하는 &lt;b&gt;DataFrame.loc, DataFrame.iloc&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&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;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;둘의 차이는 '무엇'을 기준으로 행/열을 찾느냐&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;pandas.DataFrame.&lt;span style=&quot;background-color: #f3c000;&quot;&gt;loc&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;loc의 경우 .index/column 의 이름을 찾는다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1790137366911&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.DataFrame(
    {
        &quot;name&quot;: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
        &quot;score&quot;: [80, 90, 70, 95]
    },
    index=[10, 20, 30, 40]
)

print(df)

&amp;gt;&amp;gt;&amp;gt;
   name  score
10    A     80
20    B     90
30    C     70
40    D     95

df.loc[20]

&amp;gt;&amp;gt;&amp;gt;
name      B
score    90

# index label 이 20인 행을 찾음.

df.loc[20:30]

&amp;gt;&amp;gt;&amp;gt;
   name  score
20    B     90
30    C     70
# .loc의 slicing의 경우 양 끝값 포함

df.loc[20, &quot;score&quot;]

&amp;gt;&amp;gt;&amp;gt;
90

# index가 20인 행이거니 column이 socre인 열 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;pandas.DataFrame.&lt;span style=&quot;background-color: #f3c000;&quot;&gt;iloc&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;iloc 의 경우 실제 위치를 찾는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1790137440305&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.DataFrame(
    {
        &quot;name&quot;: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
        &quot;score&quot;: [80, 90, 70, 95]
    },
    index=[10, 20, 30, 40]
)

print(df)

&amp;gt;&amp;gt;&amp;gt;
   name  score
10    A     80
20    B     90
30    C     70
40    D     95

df.iloc[1] # 두번쨰 행
&amp;gt;&amp;gt;&amp;gt;
name      B
score    90

# 여기서 1은 index label이 아니라 0부터 세었을때 1번 위치 즉 2번째 행

df.iloc[1, 1] #두번째 행, 두번째 열 
&amp;gt;&amp;gt;&amp;gt;
90

#########################################################
           column position
              0       1
           name    score
position 0   A       80      &amp;lt;- index label 10
position 1   B       90      &amp;lt;- index label 20
position 2   C       70      &amp;lt;- index label 30
position 3   D       95      &amp;lt;- index label 40
##########################################################&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같은경우 loc 과 iloc이 같은 값 반환&lt;/p&gt;
&lt;pre id=&quot;code_1790137624278&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.loc[20, &quot;score&quot;]
&amp;gt;&amp;gt;&amp;gt; 90
df.iloc[1, 1]
&amp;gt;&amp;gt;&amp;gt; 90&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loc과는 다르게 iloc의 경우 python의 일반적인 slicing 규칙을 따름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1790137733169&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.iloc[1:3]
&amp;gt;&amp;gt;&amp;gt;
   name  score
20    B     90
30    C     70&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;Boolean 을 이용한 loc&lt;/h2&gt;
&lt;pre id=&quot;code_1790138024370&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.DataFrame(
    {
        &quot;name&quot;: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
        &quot;score&quot;: [80, 90, 70, 95]
    },
    index=[10, 20, 30, 40]
)

print(df)

&amp;gt;&amp;gt;&amp;gt;
   name  score
10    A     80
20    B     90
30    C     70
40    D     95

# 먼저 
df[&quot;score&quot;] &amp;gt; 80
&amp;gt;&amp;gt;&amp;gt;
10    False
20     True
30    False
40     True
Name: score, dtype: bool

df.loc[df[&quot;score&quot;] &amp;gt; 80]
&amp;gt;&amp;gt;&amp;gt;
   name  score
20    B     90
40    D     95&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/pandas</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/65</guid>
      <comments>https://5daeng.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 23 Sep 2026 13:35:15 +0900</pubDate>
    </item>
    <item>
      <title>obspy.signal.cross_correlation.correlate_template</title>
      <link>https://5daeng.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;obsp.signal의 correlate 함수와는 다른 목적으로 쓰임.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://5daeng.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.09.09 - [Python/obpsy] - obspy.signal.cross_correlation.correlate&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1788930612339&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;obspy.signal.cross_correlation.correlate&quot; data-og-description=&quot;더보기 &amp;quot;&amp;quot;&amp;quot; Cross-correlation of two signals up to a specified maximal shift. This function only allows 'naive' normalization with the overall standard deviations. This is a reasonable approximation for signals of similar length and a relatively small sh&quot; data-og-host=&quot;5daeng.tistory.com&quot; data-og-source-url=&quot;https://5daeng.tistory.com/63&quot; data-og-url=&quot;https://5daeng.tistory.com/63&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dQAhFB/dJMb87gqjbT/7mS5EwSRaLDknH5Q9aI18K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bkO41Y/dJMb86ohl1r/oFTJ43zubzgVnX7TYnTQxK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://5daeng.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://5daeng.tistory.com/63&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dQAhFB/dJMb87gqjbT/7mS5EwSRaLDknH5Q9aI18K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bkO41Y/dJMb86ohl1r/oFTJ43zubzgVnX7TYnTQxK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;obspy.signal.cross_correlation.correlate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;더보기 &quot;&quot;&quot; Cross-correlation of two signals up to a specified maximal shift. This function only allows 'naive' normalization with the overall standard deviations. This is a reasonable approximation for signals of similar length and a relatively small sh&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;5daeng.tistory.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;b&gt;correlate(a,b, shift)&lt;/b&gt; ---- 두 비슷한 길이의 신호사이의 상대 shift 찾기 (b가 a에 비해 몇 sample 이동했나?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;correlate_template(data, template)&lt;/b&gt; ---- 긴 data안에서 짧은 template이 어디에 있는지 찾기 (이 template이 data에 어디에 있나?)&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;correlate_template은 shift를 지정하지 않고, template이 data의 전체위에서 움직인다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1788930924453&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data
------------------------------------------------------------

template
██████

가능한 위치:

██████
  ██████
    ██████
      ██████
         ...
                              ██████&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1788931017208&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def _window_sum(data, window_len):
    &quot;&quot;&quot;Rolling sum of data.&quot;&quot;&quot;
    window_sum = np.cumsum(data)
    # in-place equivalent of
    # window_sum = window_sum[window_len:] - window_sum[:-window_len]
    # return window_sum
    np.subtract(window_sum[window_len:], window_sum[:-window_len],
                out=window_sum[:-window_len])
    return window_sum[:-window_len]

def correlate_template(data, template, mode='valid', normalize='full',
                       demean=True, method='auto'):
    # if we get Trace objects, use their data arrays
    if isinstance(data, Trace):
        data = data.data
    if isinstance(template, Trace):
        template = template.data
    data = np.asarray(data)
    template = np.asarray(template)
    lent = len(template)
    if len(data) &amp;lt; lent:
        raise ValueError('Data must not be shorter than template.')
    if demean:
        template = template - np.mean(template)
        if normalize != 'full':
            data = data - np.mean(data)
            
            
    cc = scipy.signal.correlate(data, template, mode=mode, method=method)
    if normalize is not None:
        tnorm = np.sum(template ** 2)
        if normalize == 'naive':
            norm = (tnorm * np.sum(data ** 2)) ** 0.5
            if norm &amp;lt;= np.finfo(float).eps:
                cc[:] = 0
            elif cc.dtype == float:
                cc /= norm
            else:
                cc = cc / norm
        elif normalize == 'full':
            pad = len(cc) - len(data) + lent
            if mode == 'same':
                pad1, pad2 = (pad + 2) // 2, (pad - 1) // 2
            else:
                pad1, pad2 = (pad + 1) // 2, pad // 2
            data = _pad_zeros(data, pad1, pad2)
            # in-place equivalent of
            # if demean:
            #     norm = ((_window_sum(data ** 2, lent) -
            #              _window_sum(data, lent) ** 2 / lent) * tnorm) ** 0.5
            # else:
            #      norm = (_window_sum(data ** 2, lent) * tnorm) ** 0.5
            # cc = cc / norm
            if demean:
                norm = _window_sum(data, lent) ** 2
                if norm.dtype == float:
                    norm /= lent
                else:
                    norm = norm / lent
                np.subtract(_window_sum(data ** 2, lent), norm, out=norm)
            else:
                norm = _window_sum(data ** 2, lent)
            norm *= tnorm
            if norm.dtype == float:
                np.sqrt(norm, out=norm)
            else:
                norm = np.sqrt(norm)
            mask = norm &amp;lt;= np.finfo(float).eps
            if cc.dtype == float:
                cc[~mask] /= norm[~mask]
            else:
                cc = cc / norm
            cc[mask] = 0
        else:
            msg = &quot;normalize has to be one of (None, 'naive', 'full')&quot;
            raise ValueError(msg)
    return cc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 mode='valid' 인것이 합리적이고 당연하고 실제로 default 값이다. 당연히 template의 길이가 data 보다 짧아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서.&lt;/p&gt;
&lt;pre id=&quot;code_1788931210571&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data length     = 1000
template length = 100

#mode='valid'의 결과 길이는 1000-1000+1 = 901

cc[0]은 template와 data[0:100]의 비교 결과
cc[1]은 template와 data[1:101]의 비교 결과
cc[450]은 template와 data[450:550]의 비교결과&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;Normalization (full)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 template 위치마다 data window의 normalization을 새로 계산&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;415&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxjR2r/dJMcabMvf6B/jfWKBSbDW6NI7xKPmMkZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxjR2r/dJMcabMvf6B/jfWKBSbDW6NI7xKPmMkZKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxjR2r/dJMcabMvf6B/jfWKBSbDW6NI7xKPmMkZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxjR2r%2FdJMcabMvf6B%2FjfWKBSbDW6NI7xKPmMkZKK%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;415&quot; height=&quot;104&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 full normalization은 위치마다 denominator가 다르다. 따라서 진폭이 달라도 shape가 같으면 cc=1이 될 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/obpsy</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/64</guid>
      <comments>https://5daeng.tistory.com/64#entry64comment</comments>
      <pubDate>Wed, 9 Sep 2026 14:27:55 +0900</pubDate>
    </item>
    <item>
      <title>obspy.signal.cross_correlation.correlate</title>
      <link>https://5daeng.tistory.com/63</link>
      <description>&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1788918645288&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &quot;&quot;&quot;
    Cross-correlation of two signals up to a specified maximal shift.

    This function only allows 'naive' normalization with the overall
    standard deviations. This is a reasonable approximation for signals of
    similar length and a relatively small shift parameter
    (e.g. noise cross-correlation).
    If you are interested in the full cross-correlation function better use
    :func:`~obspy.signal.cross_correlation.correlate_template` which also
    provides correct normalization.

    :type a: :class:`~numpy.ndarray`, :class:`~obspy.core.trace.Trace`
    :param a: first signal
    :type b: :class:`~numpy.ndarray`, :class:`~obspy.core.trace.Trace`
    :param b: second signal to correlate with first signal
    :param int shift: Number of samples to shift for cross correlation.
        The cross-correlation will consist of ``2*shift+1`` or
        ``2*shift`` samples. The sample with zero shift will be in the middle.
    :param bool demean: Demean data beforehand.
    :param normalize: Method for normalization of cross-correlation.
        One of ``'naive'`` or ``None``
        (``True`` and ``False`` are supported for backwards compatibility).
        ``'naive'`` normalizes by the overall standard deviation.
        ``None`` does not normalize.
    :param str method: Method to use to calculate the correlation.
         ``'direct'``: The correlation is determined directly from sums,
         the definition of correlation.
         ``'fft'`` The Fast Fourier Transform is used to perform the
         correlation more quickly.
         ``'auto'`` Automatically chooses direct or Fourier method based on an
         estimate of which is faster. (Only availlable for SciPy versions &amp;gt;=
         0.19. For older Scipy version method defaults to ``'fft'``.)

    :return: cross-correlation function.

    To calculate shift and value of the maximum of the returned
    cross-correlation function use
    :func:`~obspy.signal.cross_correlation.xcorr_max`.

    .. note::

        For most input parameters cross-correlation using the FFT is much
        faster.
        Only for small values of ``shift`` (approximately less than 100)
        direct time domain cross-correlation migth save some time.

    .. note::

        If the signals have different length, they will be aligned around
        their middle. The sample with zero shift in the cross-correlation
        function corresponds to this correlation:

        ::

            --aaaa--
            bbbbbbbb

        For odd ``len(a)-len(b)`` the cross-correlation function will
        consist of only ``2*shift`` samples because a shift of 0
        corresponds to the middle between two samples.
    &quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1788918727226&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;###helper

def _pad_zeros(a, num, num2=None):
    &quot;&quot;&quot;Pad num zeros at both sides of array a&quot;&quot;&quot;
    if num2 is None:
        num2 = num
    hstack = [np.zeros(num, dtype=a.dtype), a, np.zeros(num2, dtype=a.dtype)]
    return np.hstack(hstack)

##################################################################################

def _xcorr_padzeros(a, b, shift, method):
    &quot;&quot;&quot;
    Cross-correlation using SciPy with mode='valid' and precedent zero padding.
    &quot;&quot;&quot;
    if shift is None:
        shift = (len(a) + len(b) - 1) // 2
    dif = len(a) - len(b) - 2 * shift
    if dif &amp;gt; 0:
        b = _pad_zeros(b, dif // 2)
    else:
        a = _pad_zeros(a, -dif // 2)
    return scipy.signal.correlate(a, b, mode='valid', method=method)
    
##################################################################################

def _xcorr_slice(a, b, shift, method):
    &quot;&quot;&quot;
    Cross-correlation using SciPy with mode='full' and subsequent slicing.
    &quot;&quot;&quot;
    mid = (len(a) + len(b) - 1) // 2
    if shift is None:
        shift = mid
    if shift &amp;gt; mid:
        # Such a large shift is not possible without zero padding
        return _xcorr_padzeros(a, b, shift, method)
    cc = scipy.signal.correlate(a, b, mode='full', method=method)
    return cc[mid - shift:mid + shift + len(cc) % 2]
    
##################################################################################
##################################################################################

### main

def correlate(a, b, shift, demean=True, normalize='naive', method='auto'):
  
    if normalize is False:
        normalize = None
    if normalize is True:
        normalize = 'naive'
    # if we get Trace objects, use their data arrays
    if isinstance(a, Trace):
        a = a.data
    if isinstance(b, Trace):
        b = b.data
    a = np.asarray(a)
    b = np.asarray(b)
    if demean:
        a = a - np.mean(a)
        b = b - np.mean(b)
        
    # choose the usually faster xcorr function for each method
    
    _xcorr = _xcorr_padzeros if method == 'direct' else _xcorr_slice
    cc = _xcorr(a, b, shift, method)
    
    if normalize == 'naive':
        norm = (np.sum(a ** 2) * np.sum(b ** 2)) ** 0.5
        if norm &amp;lt;= np.finfo(float).eps:
            # norm is zero
            # =&amp;gt; cross-correlation function will have only zeros
            cc[:] = 0
        elif cc.dtype == float:
            cc /= norm
        else:
            cc = cc / norm
    elif normalize is not None:
        raise ValueError(&quot;normalize has to be one of (None, 'naive'))&quot;)
    return cc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;obpsy correlation은 scipy이 correlate 함수를 쓴다.&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://5daeng.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.09.09 - [Python/Scipy] - scipy.signal.correlate&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1788925438121&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;scipy.signal.correlate&quot; data-og-description=&quot;scipy.signal.correlatehttps://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy import signal &amp;gt;&amp;gt;&amp;gt; import matplotlib.pyplot as plt &amp;gt;&amp;gt;&amp;gt; rng = np.random.default_rng() &amp;gt;&amp;gt;&amp;gt; sig = &quot; data-og-host=&quot;5daeng.tistory.com&quot; data-og-source-url=&quot;https://5daeng.tistory.com/62&quot; data-og-url=&quot;https://5daeng.tistory.com/62&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bO5MWy/dJMb8XkzoUS/kwmHr2FcM0MmWjKijnZay1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cwTYCW/dJMb8XkzoUR/3WMA4mN0tKXKnsPC7C7AH0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://5daeng.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://5daeng.tistory.com/62&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bO5MWy/dJMb8XkzoUS/kwmHr2FcM0MmWjKijnZay1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cwTYCW/dJMb8XkzoUR/3WMA4mN0tKXKnsPC7C7AH0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;scipy.signal.correlate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;scipy.signal.correlatehttps://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy import signal &amp;gt;&amp;gt;&amp;gt; import matplotlib.pyplot as plt &amp;gt;&amp;gt;&amp;gt; rng = np.random.default_rng() &amp;gt;&amp;gt;&amp;gt; sig =&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;5daeng.tistory.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;obspy correlate의 작동방식을 보면,&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;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 a,b&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Trace면 .data 추출 및 &amp;nbsp;demean&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;method에 따라 계산 방식 선택 (direct, fft, auto)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원하는 &amp;plusmn;shift 구간의 cross-correlation 계산 및 normalization&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;return cc&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;b&gt;method&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;b&gt;obspy 함수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;b&gt;scipy mode&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'direct'&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;_xcorr_padzeros()&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'valid'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'fft'&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;_xcorr_slice()&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'full'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'auto'&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;_xcorr_slice()&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;'full'&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;_xcorr_slice()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;full cross correlation을 계산하고 slice(사용자 지정 shift 만큼)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1788926486867&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def _xcorr_slice(a, b, shift, method):

    mid = (len(a) + len(b) - 1) // 2

    if shift is None:
        shift = mid

    if shift &amp;gt; mid:
        return _xcorr_padzeros(a, b, shift, method)

    cc = scipy.signal.correlate(
        a,
        b,
        mode='full',
        method=method
    )

    return cc[
        mid - shift:
        mid + shift + len(cc) % 2
    ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scipy.correlate을 이용해서 full correlation(&lt;b&gt;lag에 대한 correlation&lt;span&gt; 계산&lt;/span&gt;&lt;/b&gt;)을 계산한 후 그 간운데 &amp;plusmn;shift만 잘라냄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시,&lt;/p&gt;
&lt;pre id=&quot;code_1788926850071&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(a) = 1001
len(b) = 1001

# full correlation length : 1001+1001&amp;minus;1=2001


mid = 2001 // 2
    = 1000
    
# full CC index 

index:
0 -------------------------------- 1000 -------------------------------- 2000

lag:
-1000 ----------------------------- 0 -------------------------------- +1000
                                      &amp;uarr;
                                     mid
                                     
shift = 100 이라고 지정해주면

전체 full correlation

-1000 ================================================ +1000
                         |-----------|
                           ObsPy 반환
                          -100 ~ +100 sample
                          
                          
## ouput length : 2xshift + 1&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 lag=0 은 두 배열이 첫항부터 정렬되었을때를 말함. 아래 참고&lt;/h2&gt;
&lt;pre id=&quot;code_1788930727528&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lag = -500

b: b0 ... b500
                &amp;darr;
a:              a0 a1 ... a1000

딱 1 sample 겹침


a: a0 a1 a2 ... a500 ... a1000
b: b0 b1 b2 ... b500
   &amp;uarr;  &amp;uarr;  &amp;uarr;       &amp;uarr;

a[0]과 b[0]이 맞음

lag = +500

a: a0 ... a500 ... a1000
             &amp;uarr;
b:           b0 ... b500

이때 b가 a 안쪽 뒤쪽에 위치

lag = +1000

a: a0 ....................... a1000
                              &amp;uarr;
b:                            b0 ... b500

딱 1 sample 겹침&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;_xcorr_padzeros()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;valid mode의 결과 길이가 정확하게 원하는 2*shift + 1 정도가 되도록 두 신호 중 하나를 zero padding한다.&lt;/p&gt;
&lt;pre id=&quot;code_1788927079698&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def _xcorr_padzeros(a, b, shift, method):

    if shift is None:
        shift = (len(a) + len(b) - 1) // 2

    dif = len(a) - len(b) - 2 * shift

    if dif &amp;gt; 0:
        b = _pad_zeros(b, dif // 2)
    else:
        a = _pad_zeros(a, -dif // 2)

    return scipy.signal.correlate(
        a,
        b,
        mode='valid',
        method=method
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;normalize='naive'&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1788927428241&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;norm = (
    np.sum(a ** 2) *
    np.sum(b ** 2)
) ** 0.5


cc /= norm&lt;/code&gt;&lt;/pre&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;따라서 아래와 같은 pipeline으로 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1788927480826&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cc = correlate(
    a,
    b,
    shift=100,
    demean=True,
    normalize='naive',
    method='auto'
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1788927487971&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;correlate()
   │
   ├─ a,b numpy array 변환
   │
   ├─ mean 제거
   │
   │    a -= mean(a)
   │    b -= mean(b)
   │
   ├─ method != 'direct'
   │
   └─ _xcorr_slice()
          │
          ├─ signal.correlate(
          │      a,
          │      b,
          │      mode='full',
          │      method='auto'
          │   )
          │
          │        &amp;darr;
          │   SciPy가 direct / fft 선택
          │
          └─ &amp;plusmn;100 samples slice

         &amp;darr;

normalize

         &amp;darr;

201개 CC 반환&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python/obpsy</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/63</guid>
      <comments>https://5daeng.tistory.com/63#entry63comment</comments>
      <pubDate>Wed, 9 Sep 2026 13:20:15 +0900</pubDate>
    </item>
    <item>
      <title>scipy.signal.correlate</title>
      <link>https://5daeng.tistory.com/62</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;scipy.signal.correlate&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1788924745515&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;correlate &amp;mdash; SciPy v1.18.0 Manual&quot; data-og-description=&quot;Implement a matched filter using cross-correlation, to recover a signal that has passed through a noisy channel. &amp;gt;&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy import signal &amp;gt;&amp;gt;&amp;gt; import matplotlib.pyplot as plt &amp;gt;&amp;gt;&amp;gt; rng = np.random.default_rng() &amp;gt;&amp;gt;&amp;gt; sig = np.repeat([&quot; data-og-host=&quot;docs.scipy.org&quot; data-og-source-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&quot; data-og-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate.html#scipy.signal.correlate&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;correlate &amp;mdash; SciPy v1.18.0 Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Implement a matched filter using cross-correlation, to recover a signal that has passed through a noisy channel. &amp;gt;&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy import signal &amp;gt;&amp;gt;&amp;gt; import matplotlib.pyplot as plt &amp;gt;&amp;gt;&amp;gt; rng = np.random.default_rng() &amp;gt;&amp;gt;&amp;gt; sig = np.repeat([&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.scipy.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;correlate(in1, in2, mode='full', method='auto')&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2개의 N-dimensinal array를 교차상관한다.&amp;nbsp; &lt;b&gt;mode&lt;/b&gt;에 따라서 output size가 결정됨.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;in1, in2&lt;/b&gt; : 두 input의 차원은 같아야함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mode= 'full'&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부분적으로 &lt;b&gt;1 sample만 겹치는 경우까지 전부 포함&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;개념적으로 y를 x 위에서 왼쪽 끝부터 오른쪽 끝까지 쭉 움직이면서 correlation을 계산&lt;/li&gt;
&lt;li&gt;따라서 만약 &lt;b&gt;len(in1)=N, len(in2)=M 이면 len(output)=N+M-1&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;따라서 모든 lag에 대한 correlation 정도를 알 수 있음.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;만약 모든 lag에 대해서 조사를 하고 lag를 제한을 두면 효과적으로 사용 가능&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1788923725244&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;max_lag_sec = 2.0
max_lag_sample = int(max_lag_sec / dt)

mask = np.abs(lags) &amp;lt;= max_lag_sample

corr_search = corr[mask]
lags_search = lags[mask]

idx = np.argmax(corr_search)

best_lag = lags_search[idx]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mode = 'same'&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mode='full' correlation의&lt;b&gt; 중앙 부분만 잘라서 반환&lt;/b&gt; 이때 o&lt;b&gt;utput의 길이는 in1이랑 같게&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;len(output) = len(in1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1788924691668&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(master), len(slave)
&amp;gt;&amp;gt;&amp;gt; 1000,1000

##full

signal.correlate(master, slave, mode='full')

lag
-999 ---------------- 0 ---------------- +999

       가능한 모든 shift를 계산
       
       
       
##same

signal.correlate(master, slave, mode='same')

FULL

-999 ---------------- 0 ---------------- +999
          |&amp;lt;------ SAME ------&amp;gt;|&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mode = 'valid'&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 신호가 다른 &lt;b&gt;신호 안에 완전히 들어와 있을 때만 &lt;/b&gt;correlation을 계산&lt;/li&gt;
&lt;li&gt;출력길이는 &lt;b&gt;N-M+1&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;template matching에 유용함&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;template이 trace 밖으로 삐져나가는 위치는 아예 계산하지 않으므로&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&quot;template 전체가 trace에 존재하는 위치에서만 비교하겠다&quot;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1788924598752&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(in1)
&amp;gt;&amp;gt;&amp;gt; 5
len(in2)
&amp;gt;&amp;gt;&amp;gt; 3


##full
       x x x x x
y y y
  y y y
    y y y
      y y y
        y y y
          y y y
            y y y

총 7 positions

##same
       x x x x x
    y y y
      y y y
        y y y
          y y y
            y y y

총 5 positions


##valid 
       x x x x x

       y y y
         y y y
           y y y

총 3 positions&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;method&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;direct&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;time domain에서 직접 수행(시그마 직접 계산)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;sum;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&amp;minus;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;fft&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;freq. domain에서 두 spectrum을 곱하고 다시 IFFT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;auto
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scipy가 직접 판단 (신호길이에 따라 direct와 auto의 계산 효율 차이가 많이 나기 때문)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Python/Scipy</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/62</guid>
      <comments>https://5daeng.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 9 Sep 2026 12:36:55 +0900</pubDate>
    </item>
    <item>
      <title>Pandas- DataFrame.duplicated()</title>
      <link>https://5daeng.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1787704232288&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;pandas.DataFrame.duplicated &amp;mdash; pandas 3.0.5 documentation&quot; data-og-description=&quot;Only consider certain columns for identifying duplicates, by default use all of the columns.&quot; data-og-host=&quot;pandas.pydata.org&quot; data-og-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&quot; data-og-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.duplicated.html#pandas.DataFrame.duplicated&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;pandas.DataFrame.duplicated &amp;mdash; pandas 3.0.5 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Only consider certain columns for identifying duplicates, by default use all of the columns.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pandas.pydata.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #222832; text-align: start;&quot;&gt;&lt;span&gt;DataFrame.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #912583; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f3cf95;&quot;&gt;duplicated&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222832; text-align: start;&quot;&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;subset&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #48566b;&quot;&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #48566b;&quot;&gt;&lt;span&gt;None&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f3cf95; color: #222832; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;keep&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #48566b;&quot;&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #48566b;&quot;&gt;&lt;span&gt;'first'&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222832; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;duplicated() -&amp;gt; 중복된 행(데이터)를 찾아서 Boolean(True/False)로 반환&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Option
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;subset = 특정 열(columns)만 이용 , default = all column&lt;/li&gt;
&lt;li&gt;&amp;nbsp;keep&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;='first' :&lt;/b&gt; &lt;b&gt;중복된 값 증 처음 등장한 값 : False 그 뒤로는 True&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;='last' : 중복된 값 중 마직막 등장 값 : False 그 앞으로는 True&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;=False : 중복이 발생한 값의 모든 위치를 True&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;b&gt;예시]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1787704624225&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

s = pd.Series([0.0, 1215.0, 1215.0, 3480.0, 3480.0, 6371.0])

# 1. 기본값 (keep='first') -&amp;gt; 두 번째로 나온 중복값만 True
print(s.duplicated())
# 결과: [False, False, True, False, True, False]

# 2. keep=False -&amp;gt; 중복된 값 전체를 True로 선택
print(s.duplicated(keep=False))
# 결과: [False, True, True, True, True, False]

# 3. 중복된 고유 반경값만 추출
print(s[s.duplicated(keep=False)].unique())
# 결과: array([1215., 3480.])&lt;/code&gt;&lt;/pre&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;</description>
      <category>Python/pandas</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/61</guid>
      <comments>https://5daeng.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 26 Aug 2026 09:37:30 +0900</pubDate>
    </item>
    <item>
      <title>SAC HEADER</title>
      <link>https://5daeng.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;NPTS = number of data points&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;B = begin time&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;E = end time&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;IFTYPE = file type&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;LEVEN = evenly sampled time series&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;DELTA = spacing in time of data points&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;IDEP = physical unit of the data&lt;/span&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;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;DEPMIN = minimum amplitude&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;DEPMAX = maximum amplitude&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;DEPMEN = mean amplitude&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;OMARKER = event origin marker&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;AMARKER = first arrival (P) marker&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;T0MARKER = t0 (S) marker&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;KZDATE = reference date&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;KZTIME = reference time&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;IZTYPE = type of reference time&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;KSTNM = station name&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;CMPAZ = component azimuth relative to north&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;CMPINC = component &quot;incidence angle&quot; reletive to the vertical&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;STLA = station latitude&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;STLO = station longitude&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;STEL = station elevation&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;STDP = station depth below surface (meters)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;EVLA = event latitude&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;EVLO = event longitude&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;EVDP = event depth&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;DIST = source receiver distance in km&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;AZ = azimuth&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;BAZ = back azimuth&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;GCARC = great circle distance&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;LOVROK = TRUE if it is okay to overwrite this file on disk&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;NVHDR = Header version number. Current value is the integer 6.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;SCALE = Multiplying scale factor for dependent variable&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;NORID = Origin ID (CSS 3.0)&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;NEVID = Event ID (CSS 3.0)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;NWFID = Waveform ID (CSS 3.0)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;LPSPOL = TRUE if station components have a positive polarity (left-hand rule)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;LCALDA = TRUE if DIST, AZ, BAZ, and GCARC are to be calculated from station and event coordinates&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;KCMPNM = Component name&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;KNETWK = Network name&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000d0f; text-align: left;&quot;&gt;MAG = Event magnitude&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>programs/SAC</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/60</guid>
      <comments>https://5daeng.tistory.com/60#entry60comment</comments>
      <pubDate>Sun, 23 Aug 2026 14:14:33 +0900</pubDate>
    </item>
    <item>
      <title>Linear systems - Convolution and Deconvolution modeling</title>
      <link>https://5daeng.tistory.com/44</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Convolution&amp;nbsp;&lt;/h2&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;1024&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhaja/dJMcaf7GQ9Z/s6FR7nkRJ4Sf8uQrJEJeq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhaja/dJMcaf7GQ9Z/s6FR7nkRJ4Sf8uQrJEJeq0/img.png&quot; data-alt=&quot;Ai generated&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhaja/dJMcaf7GQ9Z/s6FR7nkRJ4Sf8uQrJEJeq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frhaja%2FdJMcaf7GQ9Z%2Fs6FR7nkRJ4Sf8uQrJEJeq0%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;1024&quot; height=&quot;211&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ai generated&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linear system으로의 해석의 장점은 complicated physical effect(multiple linear system)도 쉽게 일반화할 수 있다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 신호 $x(t)$가 두개의 linear system을 지나간다고 생각해 보자.&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;net output in time domain은 아래와 같다.&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;$$y(t) = x(t) * f(t) * g(t)$$&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;frequency domain에서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Y(\omega)=X (\omega)F (\omega)G (\omega)$$&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;Seismogram도 위와 같이 일반화 할 수 있다.&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;1024&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Y4yP/dJMcaipQnKj/jWbum0YufXB1bup5kGTAE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Y4yP/dJMcaipQnKj/jWbum0YufXB1bup5kGTAE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Y4yP/dJMcaipQnKj/jWbum0YufXB1bup5kGTAE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Y4yP%2FdJMcaipQnKj%2FjWbum0YufXB1bup5kGTAE1%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;1024&quot; height=&quot;333&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$x(t)$ 는 source signal, $g(t)$는 response of operator representing the effects of earth structure along ray path, $i(t)$는 impulse response of seismometer&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$u(t) = x(t) *g(t)*i(t)$$&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;종종 Impulse response는 시간과 공간에서 모두 정의 되기도 한다. 시간 $t$일때, 어떤 한지점 $\mathbf{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;$$ u(\mathbf{x} ,t) = \iint G(\mathbf{x-x'} ; t-t') f(\mathbf{x'},t') dt'dV'~~~\text{laterally homogeneous medium} $$&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;$G$를 green function 이라고 부른다. 그린함수는 position $\mathbf{x}$, time $t'$에서의 impulse response로 생각할수 있으며, $ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;f(\mathbf{x'},t')&lt;/span&gt; $는 seismic source의 분포로 생각할 수 있다. 따라서 이를 sum한 (integral) 결과는 source의 distribution의 total response로 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 위 식은 laterally homogeneous medium을 가정한 경우로, 그린함수의 변수는 source와 receiver의 거리 (&lt;span data-index-in-node=&quot;20&quot; data-math=&quot;\mathbf{x} - \mathbf{x}'&quot;&gt;$\mathbf{x} - \mathbf{x}'$&lt;/span&gt;) 에만 의존한다. 따라서 convolution의 형태를 갖추는 것을 관찰할 수 있다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-math=&quot;\mathbf{x}&quot; data-index-in-node=&quot;63&quot;&gt;$\mathbf{x}$)&lt;span&gt;&amp;nbsp;&lt;/span&gt;지진원의 절대 위치(&lt;span data-math=&quot;\mathbf{x}'&quot; data-index-in-node=&quot;87&quot;&gt;$\mathbf{x}'$) 가 변수이다. 아래와 같이 식이 변하고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-math=&quot;u(\mathbf{x}, t) = \iint G(\mathbf{x}, t; \mathbf{x}', t') f(\mathbf{x}', t') dt' dV'&quot;&gt;$$u(\mathbf{x}, t) = \iint G(\mathbf{x}, t; \mathbf{x}', t') f(\mathbf{x}', t') dt' dV'$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변위는 지진원 분포($f$)에 각 위치마다 다르게 적용되는 가중치 ($G$)를 곱해서 더한 결과가 displacement가 된다.&lt;/p&gt;
&lt;div data-math=&quot;u(\mathbf{x}, t) = \iint G(\mathbf{x}, t; \mathbf{x}', t') f(\mathbf{x}', t') dt' dV'&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Deconvolution&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;System이 convolution을 통해 표현될때, 우리는 system에 영향을 주는 factor들을 &lt;b&gt;deconvolution&lt;/b&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;$s(t)$ : seismogram result form convolution of&amp;nbsp; source&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$w(t)$ : source pulse or wavelet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$r(t)$ : earth structure operator ( reflector series) delta 함수의 series로 생각 할 수 있다. 마치interface로 부터 reflect되어 도착하는 arrival time이 delta function의 위치라고 생각할 수 있다.&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;1103&quot; data-origin-height=&quot;1213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYqM3C/dJMcaa6uUTg/kv3KioYkNk4Y0aGYLZBQqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYqM3C/dJMcaa6uUTg/kv3KioYkNk4Y0aGYLZBQqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYqM3C/dJMcaa6uUTg/kv3KioYkNk4Y0aGYLZBQqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYqM3C%2FdJMcaa6uUTg%2Fkv3KioYkNk4Y0aGYLZBQqK%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;1103&quot; height=&quot;1213&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;1213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-math=&quot;u(\mathbf{x}, t) = \iint G(\mathbf{x}, t; \mathbf{x}', t') f(\mathbf{x}', t') dt' dV'&quot;&gt;&amp;nbsp;&lt;/div&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;$$ s(t) = w(t) * r(t) ~\text{and}~S(\omega) = W( \omega)R( \omega) $$&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;현실에서는 source pusle ($w(t)$)는 어느정도의 두께(time duration)을 가지고 있다. 따라서 만약 반사계수열($r(t)$)이 인접해있다면,&amp;nbsp; 두 층에서의 convolution 결과가 서로 overlap 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;u(\mathbf{x}, t) = \iint G(\mathbf{x}, t; \mathbf{x}', t') f(\mathbf{x}', t') dt' dV'&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BWmCf/dJMb99Ndtz5/nfjmrRfKaOMmFTmXkpHmvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BWmCf/dJMb99Ndtz5/nfjmrRfKaOMmFTmXkpHmvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BWmCf/dJMb99Ndtz5/nfjmrRfKaOMmFTmXkpHmvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBWmCf%2FdJMb99Ndtz5%2FnfjmrRfKaOMmFTmXkpHmvK%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;1000&quot; height=&quot;1133&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 source pulse가 ideal한 delta function이라면 time domain에서의 convolution은 주파수 영역에서의 multiplication이고 delta function의 FT는 1인 상수 값이므로, 이때 결과 지진파형은 r(t)과 같아진다.&amp;nbsp;&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;하지만 실제 자연의 source pulse는 delta function 이아니다. 그러면, Inverse filter를 도입하면 어떨까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;신호의 관점에서 컨벌루션(convolution) 과정은 주파수 영역에서 다음과 같이 표현됩니다.&lt;/p&gt;
&lt;div data-path-to-node=&quot;3&quot;&gt;
&lt;div data-math=&quot;S(\omega) = W(\omega) R(\omega)&quot;&gt;$$S(\omega) = W(\omega) R(\omega)$$&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;여기서 역필터(inverse filter) $W^{-1}(\omega)$를 정의하면, 시간 영역에서의 델타 함수 $\delta(t)$에 대응하여 주파수 영역에서는 다음과 같은 관계가 성립합니다.&lt;/p&gt;
&lt;div data-path-to-node=&quot;5&quot;&gt;
&lt;div data-math=&quot;W^{-1}(\omega) W(\omega) = 1 \implies W^{-1}(\omega) = \frac{1}{W(\omega)}&quot;&gt;$$W^{-1}(\omega) W(\omega) = 1 \implies W^{-1}(\omega) = \frac{1}{W(\omega)}$$&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;따라서, 원본 신호 $R(\omega)$를 복원하는 과정은 다음과 같습니다.&lt;/p&gt;
&lt;div data-path-to-node=&quot;7&quot;&gt;
&lt;div data-math=&quot;R(\omega) = \frac{S(\omega)}{W(\omega)}&quot;&gt;$$R(\omega) = \frac{S(\omega)}{W(\omega)}$$&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;문제점 및 해결 방안&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;위의 나눗셈 과정에서 $W(\omega)$의 값이 0에 가깝게 매우 작아지면, $R(\omega)$가 무한대로 발산하는 노이즈 증폭 현상이 발생합니다. 이를 방지하기 위해 최소 진폭(water level)을 설정하는 기법이 필수적입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이를 수식으로 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;div data-path-to-node=&quot;12&quot;&gt;
&lt;div data-math=&quot;R(\omega) = \frac{S(\omega) \cdot W^*(\omega)}{|W(\omega)|^2 + \epsilon}&quot;&gt;$$R(\omega) = \frac{S(\omega) \cdot W^*(\omega)}{|W(\omega)|^2 + \epsilon}$$&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 $W^*(\omega)$는 $W(\omega)$의 켤레 복소수입니다.&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;0&quot; data-math=&quot;\epsilon&quot;&gt;$\epsilon$&lt;/span&gt;은 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Water level&lt;/b&gt;이라 불리는 작은 상수값으로, 분모가 0이 되는 것을 방지하여 안정성을 확보합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Signal processing/Linear system</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/44</guid>
      <comments>https://5daeng.tistory.com/44#entry44comment</comments>
      <pubDate>Fri, 22 May 2026 23:33:30 +0900</pubDate>
    </item>
    <item>
      <title>Vespagram - Intro</title>
      <link>https://5daeng.tistory.com/43</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Basic Theory&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 내용은 Slant stacking , Beam forming이라고 할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 지진계에서 기록된 waveform을 특정 방위각(back azimuth)또는 slowness(or rayparameter)에 맞추어 arrival time difference를 보정해서 stacking하는 방식&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;1-1. 핵심 물리량&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Slowness (or ray parameter)&lt;/b&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속도의 역수, 지진파 wavefornt의 겉보기 속도의 역수, ray incidence angle과 직접적인 연관이 있음&lt;/li&gt;
&lt;li&gt;unit : s/deg or s/km&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BAZ(back-azimuth)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관측소(array)에서 지진원(epicenter)를 바라보는 방향각&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 수학적 원리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reference station 으로부터 각 관측소 $i$ 까지의 상대적 위치벡터를 $\mathbf(r_i)$, 탐색하고자 하는 slowness vector를 $\mathbf{u}$ 라 할 때, time shift &lt;span data-index-in-node=&quot;124&quot; data-math=&quot;\Delta t_i&quot;&gt;$\Delta t_i$ 는 다음과 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;$$\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;각 관측소에서 관측된 파형 $f_i(t)$를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;time shift&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;$\Delta t_i$ 만큼 이동시켜 합산(stacking)하면 beam waveform $S(u, t)$ 가 생성&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;$$S(u, t) = \frac{1}{N} \sum_{i=1}^{Filter} f_i(t - \Delta t_i)$$&lt;/div&gt;
&lt;div data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;Linear stack : 그대로 평균&amp;nbsp;&lt;/li&gt;
&lt;li data-math=&quot;\Delta t_i = \mathbf{u} \cdot \mathbf{r}_i&quot;&gt;Nth root stack : 신호의 부호를 유지한 채 &lt;span data-index-in-node=&quot;38&quot; data-math=&quot;N&quot;&gt;$N$&lt;/span&gt;제곱근을 취해 더한 뒤 다시 &lt;span data-index-in-node=&quot;55&quot; data-math=&quot;N&quot;&gt;$N$&lt;/span&gt;제곱을 하여, 가간성(Coherence)이 낮은 무작위 배경 잡음을 획기적으로 억제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Application&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지구 심부 연구 (내/외핵, 맨틀)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;핵-맨틀 경계면(CMB) 및 내핵 연구:&lt;/b&gt; PKP, PcP, PKiKP 등 지구 심부를 통과하거나 외핵-내핵 경계면에서 반사된 위상들은 에너지가 매우 약합니다. 베스파그램을 통해 특정 내부 슬로우니스를 가진 신호만 증폭&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;맨틀 불연속성 탐지:&lt;/b&gt; 상부 맨틀 및 전이대 불연속면(&lt;span data-index-in-node=&quot;29&quot; data-math=&quot;410\text{ km}&quot;&gt;$410\text{ km}$&lt;/span&gt;, &lt;span data-index-in-node=&quot;44&quot; data-math=&quot;660\text{ km}&quot;&gt;$660\text{ km}$&lt;/span&gt;)의 상하면 반사파(Underside reflections, e.g., PP 또는 SS 전구체 위상)를 검&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위상 식별 및 도달 시간 측정&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지진동이 시작된 후 수많은 파가 겹쳐서 들어오는 코다(Coda) 구간 내에서, 이론적 도달 시간 모델(ak135, iasp91 등)과 실제 관측된 슬로우니스-시간 쌍을 대조하여 정확히 &lt;b&gt;어떤 물리적 위상(Phase picker)인지 명확하게 구분&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;지진원 및 산란원 추적 (Source &amp;amp; Scatterer Location)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지진파가 들어온 역방향(BAZ)과 입사각을 역산하여 지진원의 위치를 추적합니다. 또한 불균질한 매질에 의해 꺾여 들어오는 산란파(Scattered waves)의 기원지를 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programs/Vespagram</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/43</guid>
      <comments>https://5daeng.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 21 May 2026 16:02:52 +0900</pubDate>
    </item>
    <item>
      <title>Linear systems - Basic model and Filter</title>
      <link>https://5daeng.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Fourier analysis는 지진학에서 지진계에 작동하는 여러 factor들을 modeling하는데에 유용하게 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지진계는 ground motion을 '그대로' 기록하지 못한다. 지진계 자기자신으로 인한 효과도 같이 지진계에 기록된다.&amp;nbsp; 게다가 지진계를 흔드는 ground motion은 진원(seismic source), 지구의 elastic, anelastic structure 도 반영된다. 이러한 서로 다른 factor들의 combination이 우리가 보는 signal이다. 이러한 signal들을 잘 해석하기 위해서 linear system이라는 아이디어를 이용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적으로 하나의 operator로 해석할 수 있는데, input signal을 우리가 보는 output signal로 바꿔서 보여주는 역할을 한다고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Basic model&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linear system은 아래와 같이 나타낼 수있다.&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;$$ x_1 (t) \rightarrow y_1(t) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ X_2 (t) \rightarrow y_2(t) $$&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;두 신호를 combine 한 경우에도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ Ax_1(t) +Bx_2(t) \rightarrow Ay_1(t) + By_2(t) $$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특징을 superposition이라고 표현하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주목할 점은 Fourier transform도 Linearity를 만족한다는 것이다.&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;Linear system을 impulsive delta function에 대한 response로 생각해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템에 시간영역에서 아주짧고 강한 impulse를 input으로 준다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 impulse에 대한 resoponse 를 $f(t)$라 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ f(t) ~:impulse~resopnse~of~system $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 time series의 Fourier transform이 $F(\omega)$라고 생각 할 수 있다. 이를 시스템의 전달함수[Trasnfer 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;따라서 임의의 복잡한 입력신호 $x(t)$가 이 시스템을 통과하여 출력이 만들어질때, 시간영역에서는 두 신호를 겹쳐서 적분하는 convolution 연산이 진행되어야 한다. 하지만 주파수 영역에서는 $X(\omega)$에 system transfer function $F(\omega)$를 단순히 곱하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 156px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.7519%; height: 17px;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 49.3798%; height: 17px;&quot;&gt;Linear System&lt;/td&gt;
&lt;td style=&quot;width: 32.8682%; height: 17px;&quot;&gt;Output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 17.7519%; height: 34px;&quot;&gt;Impulse&lt;br /&gt;&lt;br /&gt;$\delta(t)$&lt;/td&gt;
&lt;td style=&quot;width: 49.3798%; height: 34px;&quot;&gt;$ \rightarrow [ Linear system : response&amp;nbsp; f(t) ] \rightarrow $&lt;/td&gt;
&lt;td style=&quot;width: 32.8682%; height: 34px;&quot;&gt;$f(t)$ : impulse response&lt;br /&gt;&lt;br /&gt;$F(\omega)$ : transfer function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 53px;&quot;&gt;
&lt;td style=&quot;width: 17.7519%; height: 53px;&quot;&gt;Arbitary signal&lt;br /&gt;&lt;br /&gt;$x(t)$&lt;/td&gt;
&lt;td style=&quot;width: 49.3798%; height: 53px;&quot;&gt;$ \rightarrow [ Linear system : response&amp;nbsp; f(t) ] \rightarrow $&lt;/td&gt;
&lt;td style=&quot;width: 32.8682%; height: 53px;&quot;&gt;$ y(t) = x(t) * f(t) $&lt;br /&gt;&lt;br /&gt;$Y(\omega) = X( \omega)F( \omega )$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;width: 17.7519%; height: 52px;&quot;&gt;Harmonic&lt;br /&gt;&lt;br /&gt;$e^{i\omega_0 t}$&lt;/td&gt;
&lt;td style=&quot;width: 49.3798%; height: 52px;&quot;&gt;$ \rightarrow [ Linear system : response&amp;nbsp; f(t) ] \rightarrow $&lt;/td&gt;
&lt;td style=&quot;width: 32.8682%; height: 52px;&quot;&gt;$F( \omega_0) e^{i\omega_0 t} $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;어떤 신호도 시스템에 들어오지 않은 상태라고 해보자. 이 시스템이 예를 들어 1Hz 성분은 2배증폭, 5Hz 성분은 감쇠 시키는 시스템이라고 해보자, 이처럼 입력될 주파수 성분을 어떻게 조작할 지 미리적어놓은 레시피가 같은 것이 전달함수, Transfer function$F(\omega)$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 전달함수가 시간영역에서 어떻게 생겼는지 알아보기 위해서 0.00001Hz부터 100000..000Hz까지의 모든 주파수를 가진 신호를 system에 input으로 넣어보기 보다는 $F(\omega)$에 1을 곱한 상태라고 생각해보자. 이를 역변환하여 나오는것이 impulse response,$f(t)$이다. 즉 전달함수의 역변환이라고 생각할 수 있다.&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;$$Y(\omega)=X(\omega) F(\omega)$$&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;주파수 영역에서의 함수는 일반적으로 복소수이므로, 위상과 amplitude도 modifiy된다.&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;time domain에서의 함수는&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;$$y(t)&amp;nbsp;=&amp;nbsp;\frac{1}{2\pi}&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;X(\omega)&amp;nbsp;F(\omega)&amp;nbsp;e^{i\omega&amp;nbsp;t}&amp;nbsp;d\omega.$$&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 time function[$x(t)$], impulse response[$f(t)$], output timefunction[$y(t)$]에 대해 알아보자&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;$X(\omega)$ 와 $F(\omega)$를 transform으로 적으면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$y(t)&amp;nbsp;=&amp;nbsp;\frac{1}{2\pi}&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;\left[&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;x(\tau)&amp;nbsp;e^{-i\omega\tau}&amp;nbsp;d\tau&amp;nbsp;\right]&amp;nbsp;\left[&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;f(\tau')&amp;nbsp;e^{-i\omega\tau'}&amp;nbsp;d\tau'&amp;nbsp;\right]&amp;nbsp;e^{i\omega&amp;nbsp;t}&amp;nbsp;d\omega,$$&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;$$y(t) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} x(\tau) f(\tau') \left[ \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega(t-\tau'-\tau)} d\omega \right] d\tau d\tau'.$$&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;bracket 안의 term은&amp;nbsp; delta function의 inverse transformation 이므로,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\text{since,}~\frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega(t-\tau'-\tau)} d\omega = \delta(t - \tau' - \tau),$$&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;$$y(t)&amp;nbsp;=&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;x(\tau)&amp;nbsp;\left[&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;f(\tau')&amp;nbsp;\delta(t&amp;nbsp;-&amp;nbsp;\tau'&amp;nbsp;-&amp;nbsp;\tau)&amp;nbsp;d\tau'&amp;nbsp;\right]&amp;nbsp;d\tau.$$&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;$$y(t) = \int_{-\infty}^{\infty} x(\tau) f(t - \tau) d\tau =x(t) * f(t).$$&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;와같이 적을 수 있다. 이것이 convolution의 정의&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;따라서 linear system의 ouput은 input signal과 impulse response의 convolution이라고 적을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, time domain에서의 convolution은 freqency domain에서의 multiplication이다.&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;$ Y(\omega)=X(\omega) F(\omega) \leftrightarrow y(t)= x(t) * f(t) $&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;따라서 Linear system을 아래와 같이 정리할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;In time domain - Impulse response
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템이 시간의 흐름에 따라 신호에 어떻게 반응하는지,,,&lt;/li&gt;
&lt;li&gt;이때 입력신호(input)와 임펄스응답(impulse response)을 convolution하여 출력결과가 나옴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In frequency domain - transfer function
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;impulse 응답을 수학적으로 변화( 푸리에 변환, 라플라스변환) 하여 주파수 관점으로 바라봄&lt;/li&gt;
&lt;li&gt;입력신호의 변환과 시스템의 전달함수의 단순곱으로 출력결과 알 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. Filter&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지진파 기록을 특정 주파수 대역에서만 보고 싶을 때는,&amp;nbsp; bandpass filter를 사용 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filtering을 하기 위해서는 frequency domain 에서&amp;nbsp; 필터를 seismogram의 fourier transform을 곱하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 bandpass filter가 곱해진 fourier transform of seismogram은 특정 주파수 대역만 살아남게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 inverse transform을 취하면 bandpass 된 결과를 볼 수 있는데 이는 사실 bandpass filter의 impulse response를 time domain에서 convolution 한것 과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;a7c29c0b-710a-4660-ba2d-6073b8ef94ea.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AqhZy/dJMcahdpffJ/dr3wkf3pTz8f33sBilAERk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AqhZy/dJMcahdpffJ/dr3wkf3pTz8f33sBilAERk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AqhZy/dJMcahdpffJ/dr3wkf3pTz8f33sBilAERk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAqhZy%2FdJMcahdpffJ%2Fdr3wkf3pTz8f33sBilAERk%2Fimg.jpg&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;1024&quot; height=&quot;613&quot; data-filename=&quot;a7c29c0b-710a-4660-ba2d-6073b8ef94ea.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇가지 주의할 점이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 filter를 positive frequency에서만 plot한다. 하지만, negative frequency에서도 정의되어야 한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과 signal 이 real이여야 하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;bandpass filter의 impulse response가 impulse 전부터 생기는 것을 주목
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우너래 'impulse response'는 delta function(모든 주파수성분이 담긴)이 들어왔을 때의 time series의 반응인데, banpass filter는 특정 주파수만 담기 때문에&amp;nbsp; 시간영역에 신호가 들어오기 전부터 응답이 시작되는 비인과적인 형태가 나타남.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;filter의 끝부분이 sharp corner를 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;smoothing을 필요로 함. 왜냐하면&amp;nbsp; gibbs phenomenon 발생 혹은 위에서 언급한 noncausal artifact가 생김.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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 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;</description>
      <category>Signal processing/Linear system</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/42</guid>
      <comments>https://5daeng.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 19 May 2026 00:48:06 +0900</pubDate>
    </item>
    <item>
      <title>Fourier Analysis - Delta functions</title>
      <link>https://5daeng.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 짧은 시간 동안 '충격'처럼 전달되는 신호를 어떻게 표현 할까?? 이런 신호를 표현하는 유명한 신호가 바로 &lt;b&gt;Dirac delta function&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Definition and Properties&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delta 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;$ t=t_0 $에서의 Delta function은,, Gaussian function의 극한으로 설명할 수 있다. Gaussian function의 넓이는 1임을 주목하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;\delta(t - t_0) = \lim_{\sigma \to 0} \frac{1}{\sigma\sqrt{2\pi}} \exp \left[ \frac{-1}{2} \left( \frac{t - t_0}{\sigma} \right)^2 \right].&quot;&gt;$$\delta(t - t_0) = \lim_{\sigma \to 0} \frac{1}{\sigma\sqrt{2\pi}} \exp \left[ \frac{-1}{2} \left( \frac{t - t_0}{\sigma} \right)^2 \right].$$&lt;/div&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;집중성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$t = t_0$에서는 무한대의 값, 나머지는 0의 값을 가짐.
&lt;div data-math=&quot;f(t_0) = \int_{-\infty}^{\infty} f(t) \delta(t - t_0) \, dt&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;면적&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;div data-math=&quot;\int_{-\infty}^{\infty} \delta(x) dx = 1&quot;&gt;$\int_{-\infty}^{\infty} \delta(t-t_0) dt = 1$&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Shifting&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$f(t_0)&amp;nbsp;=&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;f(t)&amp;nbsp;\delta(t&amp;nbsp;-&amp;nbsp;t_0)&amp;nbsp;\,&amp;nbsp;dt&amp;nbsp;=&amp;nbsp;f(t_0)&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;\delta(t&amp;nbsp;-&amp;nbsp;t_0)&amp;nbsp;\,&amp;nbsp;dt$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Relation with Step function [Heaviside function]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;delta function은 step function의&lt;b&gt; derivative&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.&amp;nbsp; Fourier Transform of Delta function[in time domain]&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f(t)&amp;nbsp;=&amp;nbsp;\delta(t-t_0)&amp;nbsp;\iff&amp;nbsp;F(\omega)&amp;nbsp;=&amp;nbsp;\int_{-\infty}^{\infty}&amp;nbsp;\delta(t-t_0)&amp;nbsp;e^{-i\omega&amp;nbsp;t}&amp;nbsp;\,&amp;nbsp;dt&amp;nbsp;=&amp;nbsp;e^{-i\omega&amp;nbsp;t_0}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ |F(\omega)| =1 , \phi(\omega) = -\omega t_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;만약 $t_0 = 0$ 이면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f(t) = \delta(t) \iff F(\omega) = \int_{-\infty}^{\infty} \delta(t) e^{-i\omega t} \, dt = 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;따라서 delta function의 amplitude spectrum은 모든 주파수에서 1의 unit amplitude를 가짐을 알 수 있다.&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;inverse transform 은 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{-i\omega t_0} e^{i\omega t} \, d\omega = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega (t-t_0)} \, d\omega = \delta(t - t_0),&quot;&gt;$$f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{-i\omega t_0} e^{i\omega t} \, d\omega = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega (t-t_0)} \, d\omega = \delta(t - t_0),$$&lt;/div&gt;
&lt;div data-math=&quot;f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{-i\omega t_0} e^{i\omega t} \, d\omega = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega (t-t_0)} \, d\omega = \delta(t - t_0),&quot;&gt;따라서 delta function은 모든 주파수의 sinusoid들의 합으로 생각할 수 있다.&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Fourier Transform of Delta function [in frequency domain]&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delta function at angular frequency at $\omega_0$ 는&amp;nbsp; $ \delta(\omega - \omega_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;time domain으로의 inverse transform은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} \delta(\omega - \omega_0) e^{i\omega t} \, d\omega = \frac{1}{2\pi} e^{i\omega_0 t}&quot;&gt;$$f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} \delta(\omega - \omega_0) e^{i\omega t} \, d\omega = \frac{1}{2\pi} e^{i\omega_0 t}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;time domain에서 freq domain으로의 transform은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt&quot;&gt;$$\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt$$&lt;/div&gt;
&lt;div data-math=&quot;\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt&quot;&gt;주파수가 $\omega_0$인 sinusoid들의 합으로 생각 할 수 있다.&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. example $f(t) = cos(\omega t_0) $&lt;/h3&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;div data-math=&quot;\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt&quot;&gt;$$f(t) = cos(\omega_0 t)&amp;nbsp; = ( e^{i\omega_0 t}+ e^{-i\omega_0 t} )/ 2 $$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt&quot;&gt;푸리에 변환은&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;$$F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.$$&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;오른쪽 부분은 두개의 frequency domain에서의 delta function과 같다. 따라서&amp;nbsp;&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \pi [\delta(\omega - \omega_0) + \delta(\omega + \omega_0)].&quot;&gt;$$F(\omega) = \pi [\delta(\omega - \omega_0) + \delta(\omega + \omega_0)].$$&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-math=&quot;F(\omega) = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i\omega_0 t} + e^{-i\omega_0 t}] e^{-i\omega t} \, dt = \frac{1}{2} \int_{-\infty}^{\infty} [e^{i(\omega_0 - \omega)t} + e^{-i(\omega_0 + \omega)t}] \, dt.&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-math=&quot;\delta(\omega - \omega_0) = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i\omega_0 t} e^{-i\omega t} \, dt = \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i(\omega_0 - \omega)t} \, dt&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Signal processing/Fourier analysis</category>
      <author>bangboo__</author>
      <guid isPermaLink="true">https://5daeng.tistory.com/41</guid>
      <comments>https://5daeng.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 4 May 2026 05:36:55 +0900</pubDate>
    </item>
  </channel>
</rss>