일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- 설문조사앱
- 웹개발
- Django웹개발
- 왜 개발이 하고싶은가
- MTV패턴
- sql정리
- Django cycle
- Django DB
- matlab 디지털신호처리
- bandpass filter
- embeddedSW
- 완주하지 못한 선수
- 알고리즘풀이
- 쿼리문법
- 코딩테스트
- select
- 자동 commit
- python웹개발
- 통신인터페이스
- 알고리즘 자동 업로드
- Django서버
- 디지털신호처리설계
- N으로 표현
- Django웹서버개발
- 데이터필드
- 프로그래머스
- programmers
- Django
- 링크필드
- SQL
- Today
- Total
카이로스의 시간
[디지털 신호처리 설계] dtmf 본문
Dual-tone multi-frequency signaling (Matlab)
[서론]
전화기 다이얼누를때 나는 소리 0~9,*,#은 주파수 2개의 합성음입니다.
그 주파수에 대해 분해, 관찰, 관찰 해서 누른 번호에 대해 몇 번이 눌렸는지 decision,잡음이 섞여있다면 잡음제거 등을 포스팅하겠습니다.
툴은 matlab을 사용합니다.
출처 : https://www.sigidwiki.com/wiki/Dual_Tone_Multi_Frequency_(DTMF)
[본론]
우선 잡음이 섞여있는 dtmf.wav 파일을 준비합시다.
이런식으로 잠음이 껴있는 dtmf파일을 준비했습니다. 아직 다이얼 몇번인지는 확인할 수 없습니다.
대략적으로 200~1300에서 신호특성이 잘 나타남을 확인할 수 있습니다. 그래서 400~800까지 잘라서 주파수축에서 확인해보겠습니다.
<matlab source>
[data,Fs] = audioread('dtmf1.wav');
%plot(data);
trimmed_data=data(400:800); %400~800까지 잘라서 사용
L = 500;
E = fft(trimmed_data,L);
plot(abs(E));
이런식으로 잘린 데이터에 주파수특성을 보기위해 fft를하면 250 기준으로 양쪽에 두개씩 주파수가 나옵니다.
샘플링주파수(Fs)는 8000Hz가 나옵니다.
확대해보면 왼쪽부터 44,77Hz에서 peak가 나옵니다. 즉 500으로 샘플링된 주파수축에서 44,77Hz 이므로,
44*8000/500 = 704Hz, 77*8000/500 = 1232Hz가 나옵니다. 250기준으로 오른쪽은 왼쪽주파수가 반복되서 나오는것이므로 고려하지 않습니다.
위에 첫번째 그림으로 돌아가 704Hz와 1232Hz에서 비슷한 값을 찾으면 다이얼 1번으로 결정할 수 있습니다. 따라서 받은 파일의 다이얼 번호는 1번이됨을 알 수 있습니다.
다음으로 fdatool을 사용해서 filter를 설계해서 노이즈 제거를 하겠습니다.
요런식으로 matlab에 fdatool을 써서 필터를 설계할 수 있습니다. 원하는 것은 697Hz,1209Hz가 통과되는 필터를 설계하는것입니다.
위에 데이터에 맞게 bandpass type을 사용하고 잡음을 제거하기위해 원하는 주파수성분(697Hz,1209Hz)기준으로 나머지는 bandstop을 하여 노이즈가 제거 되는 필터를 만듭니다. 위에그림은 697Hz를 위한 filter입니다. fdatool을 두번사용해야겠죠.
fdatool을 사용하고 file->export를 누르면 SOS값과 G값에 naming을 할 수 있습니다.저는 SOS1,G1,SOS2,G2로 했습니다.
여기서 G값은 Gain값으로, 곱해주어 결과값 Magnitude를 낮춰주겠습니다.
y1 = sosfilt(SOS1,data); %fdatool을 사용해서 filter를 설계하고 나온 sos1값으로 data 필터링
y1 = fft(y1);
plot(abs(y1));
y2 = sosfilt(SOS2,data);
y2 = fft(y2);
plot(abs(y2));
G1_value = 1;
for k=1:length(G1) %G1에 있는 값 곱하기 위해 for문 사용
G1_value = G1_value * G1(k);
end
G2_value = 1;
for k=1:length(G2) %G2에 있는 값 곱하기 위해 for문 사용
G2_value = G2_value * G2(k);
end
y = y1*G1_value + y2*G2_value; %신호 합한다
plot(abs(y))
이렇게하면,
요런식으로 설계한 필터를 통과한 합친신호 주파수영역 값이 나옵니다.
끝으로 필터 통과한 신호값을 ifft하면 파형스펙트럼을 볼 수 있습니다.
y = ifft(y);
plot(y);
이런식으로 ifft합니다.
[결론]
dtmf.wav파일을 받아 특정구간을 잘라 주파수 특성을 보았고 그로인해 다이얼 몇 번인지 decision했습니다.
노이즈 제거를 위해 filter를 설계하고 필터를 sosfilt를 통해 통과시킨 데이터를 보았습니다.
주의할점은 Gain이었습니다. Gain을 안곱해주면 신호의 세기가 크게나와 소리를 확인해보면 원래 소리보다 크게 나오는 문제점이 있었습니다.
그런데 Gain값을 곱해서 신호를 합한결과 원래의 magnitude와 유사하게 나옴을 확인할 수 있었습니다.
'기타' 카테고리의 다른 글
Database SQL 쿼리 문법 정리 Part2 (0) | 2022.04.10 |
---|---|
Database SQL 쿼리 문법 정리 Part1 (0) | 2022.04.04 |
GCP로 git commit, push 자동 시스템 구축 (0) | 2022.03.29 |
텐서플로우(tensorflow) 설치 (0) | 2017.09.14 |
[통신공학] matlab을 이용한 piano project (0) | 2017.09.14 |