본문 바로가기

물리

CD표면에 반사된 백색광의 회절격자

아래  참고자료1의 소스코드에서 힌트를 얻고, 앞서 빛의 회절과 간섭의 내용과 이어지는 포스팅입니다.

 

회절격자(diffraction grating)는 광원을 분석하는 데 유용한 기구로서, 일정한 간격의 많은 평행한 슬릿으로 구성되어 있다. 회절 격자는 유리판 또는 금속판 위에 정밀한 줄긋는 기계로 평행하게 똑같이 공간상에 홈을 그어 만들 수 있다. 투과 회절 격자에서, 슬릿 사이의 공간은 빛이 투과할 수 있으므로 분리된 슬릿처럼 작용한다.

따라서 CD표면에는 약 1μm의 간격으로 나선 모양의 트랙이 있어, 반사 회절 격자로 작용한다. 빛은 파장과 입사광의 방향에 따라 보강 간섭을 하는 매우 가까운 간격의 트랙에 의해 분산된다. CD의 어떤 부분은 백색광의 회절 격자 역할을 하고, 다른 방향으로 다른 색의 간섭광을 보낸다. CD의 한 부분을 볼 때, 광원이 변하거나 입사각이나 보는 방향을 달리하면 다른 색을 볼 수 있다.

 

그럼 이제 CD표면에 반사된 백색광의 회절격자를 유사하게 시각화해 보겠습니다. (참고자료1의 비눗방울 박막 시각화를 다른 예로 조금 변형해 보았어요)

참고로 예시에서는 경로차가 CD 위에서 아래로 직선으로 증가되게 단순화 했지만, 비슷한 느낌으로 모사되네요.

먼저 소스코드를 살펴볼게요!

 

"""
Created on Thu Aug 10 11:35:34 2017 @author: wskang
modified on 12-12-2024 @ me
"""
import numpy as np
import matplotlib.pyplot as plt
import base64, zlib

# =============================================================================

_c = b'eNrV0ltr0AUAxuHn1rqoiAqSiA6EEJ3ogBUJeeFFRUdJOjOyWau1bLZpGztnM1oyy' \
        b'2yYmcmMETPNlixNVpmssobKMJuYDVnNGksz0zTe5C9BXyF4v8Dz4y1RMlPpLGVlKs' \
        b'pVVqh+Vu0cDVVa5mqdp61Ge63FdTrqLWuwolFno64m3U3WNutp1ttsY7O+Jpub9Df' \
        b'a2migwY56O+sM1dpTY3iekblGq4zNcWC2QxWOlDtWJqVSIg/JfTJd7pRbZZpMlZtk' \
        b'slwtl8skuUjOk3PkDDlFnNipcWZMjAtjUlwR18aNcXNMi9virpgRD0ZJlMZTMTuqo' \
        b'ibqoyUWxCuxKJbEm/F2dEZXrI4PYn1siL7YHP3xTWyLwfg+9sRwjMT+GI/f4884Fj' \
        b'mxP2S/7JVB+Vr6pEe65C1ZJC9KjTxduKcX1smF74TMhDgtzopz4/y4uGBdFlfFdXF' \
        b'DTImpBe6WuD3ujnvj/ni4ID4WTxTKZ6IyqgtoXTTGC9EaL8fCgvt6dPwrXhmrCnR3' \
        b'rIl18VH0xicF/fPYEl/G1hiI7UWA72KoaPBj7Iufigxj8VtR4nAcjeMnYxyXo3JYD' \
        b'sq4/CqjMiLD8oPsll1Fp+0yUNTqly/kU9kkG2S9fChrpLtIuErekeWyVN6Q16Rd2m' \
        b'SBzJcmqSvqVkulVMiTMkselUfkAZkh98gd/znZFLlerpEr5VK5RC6QiXK2nC4TTv7' \
        b'sf7C/OcZfHOEwhzjIAcYZ4xdG+ZkR9jHMXvawmyF2sZNBdrCNAb5lK1/RzxY28xl9' \
        b'bGIjH9PLenpYx1rep5v36OJdOlnJCpazjKV0sITFvEo7C2njJVqZTwtNNFBHLc9Tz' \
        b'XNUMpsKyinjcUqZSQn/AJ7p9HY='
_ct = base64.b64decode(_c)   # base64 -> byte
_ctbl = zlib.decompress(_ct)   # compression and decompression, using the zlib library

def rgb(nm):
    """
    Converts a wavelength between 380 and 780 nm to an RGB color tuple.
    Argument:
        nm: Wavelength in nanometers. It is rounded to the nearest integer.
    Returns:
        a 3-tuple (red, green, blue) of integers in the range 0-255.
    """
    nm = int(round(nm))
    if nm < 380 or nm > 780:
        raise ValueError('wavelength out of range')
    nm = (nm - 380) * 3
    return _ctbl[nm:nm + 3]
# =============================================================================

# max discrepancy in nm
max_dd = 2000

# box size for plotting
nx = max_dd
ny = max_dd

# add the discrepancy in diffraction grating
dd = np.linspace(0,max_dd, max_dd)

# wavelength array for calculation
ll = range(380,780,5)  # in nm
nl = len(ll)

# GEN. the phase of EMW
xx = np.linspace(0, 4*np.pi,1000)

fig1, ax1 = plt.subplots()
# APPLY interference into RGB-power for all wavelength
line = np.zeros([nx,3])
for i in range(nx):
    for j in range(nl):
       wave = np.sin(xx) + np.sin(xx + 2*np.pi*dd[i]/ll[j])   # k[rad/m] * d  
       line[i,:] += np.sum(wave**2) * np.array([*rgb(ll[j])])
       
for j in range(3):
    line[:,j] = line[:,j] / np.max(line[:,j])

# PLOT the relative intensity for each RGB-color
ax1.plot(dd,line[:,0], 'r-', label='RED')
ax1.plot(dd,line[:,1], 'g-', label='GREEN')
ax1.plot(dd,line[:,2], 'b-', label='BLUE')
ax1.set_xlabel('Path Length Difference [nm]')
ax1.set_ylabel('Relative intensity')
ax1.legend()
ax1.grid()

# PLOT the color image with RGB colors
img = np.zeros([nx,ny,3])
for k in range(ny):
    for j in range(3):
        img[:,k,j] = line[:,j]

for i in range(ny) :
    for j in range(ny) :
        if (i-1000)**2+(j-1000)**2>1000**2 : img[i,j,:] = [1, 1, 1]
        if (i-1000)**2+(j-1000)**2<325**2 : img[i,j,:] = [0.95, 0.95, 0.95]
        if (i-1000)**2+(j-1000)**2<200**2 : img[i,j,:] = [1, 1, 1]

fig2, ax2 = plt.subplots()
ax2.imshow(img)
ax2.set_ylabel('Path Length Difference [nm]')
ax2.xaxis.set_visible(False)

plt.show(block=False)

 

먼저 base64(6비트) 코드를 byte(8비트)로 디코딩하고 압축을 풀면, 특정 파장에 따른 RGB 비 값을 얻을 수 있습니다.

광 경로차가 직선으로 증가되게 주어졌을 때, 각 파장별 2주기 동안 보강 및 상쇄의 결과인 진폭의 제곱에 그 파장에 맞는 RGB값을 곱하고, 각각의 RGB의 최대값으로 정규화를 하여 마지막으로 이미지로 표현을 하는 것입니다.

아래 그래프는 임의로 선택한 600nm 파장의 빛이 경로차에 따라 달라지는 wave를 그린 것이고, 그 밑의 그래프는 이렇게 구한 다양한 경로차에서 빛의 RGB값을 표현한 것입니다.    

 

a. 경로차에 의한 임의의 파장의 wave 변화 b. 경로차 따른 최종 RGB값

 

최종적으로 RGB 이미지로 표현을 해보면, 짜 쟌~ 아래처럼 그럴듯해 보이게 됩니다! 

좀 신기하고 멋지지 않나요?!ㅎㅎㅎ

CD표면에 반사된 백색광의 회절격자

 

이밖에 분광기도 회절격자 구조이기 때문에 빛을 파장별로 분리할 수 있는 장치이고,

자연에서도 공작새, 나비, 전복 껍데기, 카멜레온에서 회절격자 현상을 관찰할 수 있다고 해요.

 

 

지금까지 읽어주셔서 감사드리고, 아무쪼록 여러분! 즐거운 성탄절과 Happy New Year~! 

특히 이번 주말 좋은 일이 생기길 기대하고, 정상적이고 상식적인 세상이 하루 빨리 찾아왔으면 좋겠습니다!

 

<참고자료>

1. [교육자료] 비눗방울 색의 정체, 박막 간섭(film interference)

2. Diffraction grating - 위키백과, 우리 모두의 백과사전

3. [고급물리학] 파동의 중첩에 따른 간섭과 회절

4. 최신대학물리학II