일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DTFT
- 알고리즘 문제풀이
- 이산신호처리
- 독서노트
- 코딩테스트
- DSP
- SWIFT
- leet code
- Leet Coding Challenge
- 트라이
- 코테준비
- PYTHON
- 전자공학
- 스위프트
- 코테
- dft
- 백준
- 신호처리
- 알고리즘문제풀이
- backjoon
- 릿코드
- IOS
- 파이썬
- 컨볼루션
- 카카오 코딩테스트
- 프로그래머스
- leetcode
- Trie
- 알고리즘
- SWIFTUI
- Today
- Total
매일 매일 성장하는 섭섭군
[Seop's 강의노트] MATLAB 으로 DFT 구현하기. 본문
이번 포스팅에서는 MATLAB 을 활용하여 N-point DFT 를 구현 하는 과정을
살펴보고자 한다. DFT 에 대한 설명은 다음 포스팅을 참고하기를 바란다.
https://richard25.tistory.com/13?category=355673
DFT 를 구현하는 과정은 식을 그대로 MATLAB 코드에 적용하면 된다.
기본적인 MATLAB 코드를 작성 할 줄 안다면 어려운 과정은 아닐 것이라
생각된다. N-Point DFT 식은 다음과 같이 표현 할 수 있다.
이제 어떻게 위 식을 코드로 작성할지에 대해서만 생각하면 된다.
다음 초기 설정 코드를 살펴보면서 같이 알아보도록 하자.
function [f_hat , Xk] = myfun_N_Point_DFT(x)
x_len = length(x);
N_to_Sum = 0 : 1:(x_len-1);
Xk_mid = [zeros(1,x_len)];
f_mid = [zeros(1,x_len)];
입력으로 들어온 x 값의 길이를 알아내면 신호의 길이인 N을 알아 낼 수 있었다.
n은 0 ~ N-1 이므로 ’ N_to_Sum = 0 : 1:(x_len-1); ’으로 구현해
주었다. 이는 매틀랩의 배열이 여타 다른 프로그래밍 언어들과는 달리 ‘0’번째 행렬이 없고 ‘1’번째 행렬부터 시작되기 때문이다. 뒤에 있는 mid값들은 중간값으로
연산 과정을 좀더 보기 편하게 하고자 넣어주었다. 실제로 DFT 과정을 처리하는
부분은 다음과 같이 나타내어 질 수 있다.
for k=1 : x_len
for n=1:x_len
Xk_mid(k) =Xk_mid(k) + x(n)*
exp(-1i*2*pi*(N_to_Sum(k)/x_len)*N_to_Sum(n));
end
end
이중 for 문을 사용하여 구현해 주었다. 원래 DFT 의 식대로 구현한 모습을 볼 수 있다. DFT의 곱셈 연산 횟수는 N^2 번 이므로 N 이 커질경우 상단한 연산이
필요하게 되며 시스템은 그만큼 복잡해진다. 곱셈 연산 횟수는 위 코드를 보면 쉽게
이해 될 것이라 생각된다. k 와 n 이 똑같이 x_len(N) 번 반복하기 때문이다.
위 과정을 거치게 되면 시간축에서의 이산신호를 주파수 영역에서도 이산으로 볼 수 있게되는 DFT 를 구현 할 수 있다.
다음은 이산 cos 신호를 DFT한 예시 모습이다.
위 신호는 주파수가 0.1 이며 N=50 인 경우이다.
우리가 이론적으로 계산 한 것과 동일하게 나오는 모습을 볼 수 있다.
MATLAB을 이용하여서 DFT 변환을 진행해 보았다.