ST 퀘스트 이벤트
Quest 7
퀘스트 7/7 - 파이널 퀘스트 작성자 : 3958

주파수 분석기

 

 

< 과제 선정 배경 >

Quest 4,5를 진행하면서 Quest 7은 어떤 과제가 나올까 고민을 해 봤습니다.

아무래도 DK2 보드의 기능을 종합적으로 사용하는 것이 아닐까 생각만 했습니다.

AP와 MCU와의 Communication 관련된 것은 아닐까 생각했습니다.

 

하지만 Quest 7은 자율과제. 이틀은 과제로 무엇을 선정해야 될지 고민했습니다.

2주라는 기간안에 완성해야 했기에 할 수 있는 것이 제한적이었습니다.

 

기간내 완성이 가능하고, H/W의 기능을 다양하게 활용할 수 있는 과제를 고민하는 중에 주파수 분석기를 선택하게 되었습니다.

   * STM32MP157에는 ADC Module이 내장.

   * STM32MP157의 M4 Core는 FPU와 DSP 지원.

   * DK2 Board에는 LCD가 탑재. QT를 이용한 Application GUI Application 제작 가능.

 

 

< Hardware >

외부 Pin Header로 나와있는 PF14를 통하여 입력 받았으며, ADC2 Module을 통하여 Analog 신호를 Capture 하였습니다.

 

DK2 Board는 Vref+가 기본적으로 단락 되어있습니다. 그래서 Vref+를 넣어주어야 합니다.

 

다행히 Pin Header에 해당 Pin이 있어 연결이 쉽습니다.

 

 

< FFT >

STM32MP157의 ADC Module은 8bit에서 최대 6 MSamplings/s 입니다.

Audio Signal 분석용으로 만들기에는 충분합니다. 사람의 가청주파수는 20 ~ 20,000 Hz라고 합니다. 그래서 보통 MP3 파일은 24 KHz로 Decoding 되어 있습니다. 그래서 2배인 48 KHz, 약간 딱 맞으면 정(?) 없으니깐 50KHz로 Sampling 하기로 하였습니다.

 

정확한 Sampling Time과 MCU의 부하를 줄이기 위하여 TIM과 DMA를 추가로 사용하였습니다.

TIM1은 PLL을 통해 208,877,930 Hz의 Clock이 입력됩니다. 이를 이용하여 약 49,970.79665 Hz (20.0116881663850 us) 로 Sampling 하였습니다.

 

FTT을 위한 Number of Sampling 은 2^10 (1024) 개로 하였습니다.

 

CMSIS DSP Library의 arm_cfft_f32() 함수를 이용하여 FFT 하였습니다.

참고 : https://www.st.com/resource/en/application_note/dm00273990-digital-signal-processing-for-stm32-microcontrollers-using-cmsis-stmicroelectronics.pdf

 

그리고 1초에 약 15회 Sweep 하도록 하였습니다.

 

 

< Data 전송 >

M4에서 FFT 된 Data는 A7 Linux Application에 전달되고 이를 이용하여 그래프로 그려지게 됩니다.

이때 M4에서 A7(또는 A7에서 M4)으로의 Data 전송하는 방법에는 몇가지 방법이 있습니다. 이 부분에 대해서는 메이슨님이 정리를 잘 해주셔서 아래 메이슨님의 링크로 대처합니다.

메이슨님 자료 : https://make.e4ds.com/make/st_board_view.asp?idx=207&t=2

 

이중 저는 RPMSG를 이용하여 Data를 전송하였습니다. 가장 쉽게 구현 가능할 것으로 판단되어 선택하게 되었습니다.

참고 : https://wiki.st.com/stm32mpu/wiki/Linux_RPMsg_framework_overview

 

FFT 된 Data는 총 512개의 float를 전송해야 합니다. 간단하게 전송해야 할 Data Size를 구해보면 float 4byte * 512 개 = 2Kbyte 입니다.

RPMSG를 통해 한 번에 보낼 수 있는 Max size는 512 byte입니다. 하지만 이 중에 16byte는 이미 사용중입니다. 그래서 한 번에 496 byte 입니다.

참고 : https://github.com/OpenAMP/open-amp/wiki/RPMsg-Messaging-Protocol

 

이를 RPMSG Buffer Size 보다 큰 Data를 보내기 해서는 RPMSG Buffer Size를 늘리거나, Data를 나누어서 전송해야 합니다.

그리고 전송해야 되는 FFT Data의 Data Size가 너무 커 FFT Data를 압축하여 전송 Data양을 줄였습니다.

Linux Application에서 Thread를 생성하여 Data 수신을 하여, 수신된 Data를 다시 복원시키고 수신 완료 응답을 보냅니다.

 

   % 구현중 하나의 문제를 발견하였습니다. 아직 정확한 원인을 확인하지 못하였지만, RPMSG를 이용한 전송 Data 중 특정 값에 대하여 전송되지 못하는 경우가 있었습니다. 이 경우 다른 값으로 대처하여 전송하였습니다.

   (ex> Data 중 0x03이 있는 경우 0x03 이전 Data가 전송되지 않음)

 

 

< Linux Application >

QT Widget 를 이용하여 GUI를 구성하였습니다.

QCustomPlot을 이용하여 그래프를 그렸습니다. 이때 FFT Data를 쉽게 보기위해서 Y Scale을 Log Scale로 변경하여 표시하였습니다. 

참고 : https://www.qcustomplot.com/

 

 

< Demo >

   % 1KHz Square Wave(Duty 50%) 를 출력하는 Device가 있어 이를 이용하여 Test 진행 하였습니다.

   % 해당 결과는 Square Wave의 특징을 잘 보여주고 있습니다.

      1. DC 성분이 많기 때문에 0Hz의 값이 가장 큽니다.

      2. 1KHz의 Wave를 입력하였기 때문에 1KHz의 값이 0Hz 다음으로 가장 큽니다.

      3. Square Wave 의 특징 중 하나인 짝수 번째 Harmonic 성분이 보이지 않습니다.

 

   % No signal -> 500Hz -> 1KHz 로 변화 하는 것을 확인 할 수 있습니다.

 

< 실행방법 >

  1. DRM/DRI Disable

     BD> psplash-drm-quit

  2. Display Rotation

      BD> export QT_QPA_EGLFS_ROTATION=90

  3. M4 Firmware(Spectrum_CM4.elf) Loading 및 실행

 

  4. Linux Application(Spectrum_A7) 실행

     BD> ./Spectrum_A7

 

 

< 추후 추가 개발 >

   1. Fs 를 최대 5 MSampling/s로 늘리고, 이를 변경 가능하도록 추가.

   2. NFFT 변경 가능하도록 추가.

   3. 오실로스코프 기능 추가.

   4. 위 기능들 추가로인해 전송 Data 양이 늘어남에 따라 Data 전송 방법 변경.

      - https://wiki.st.com/stm32mpu/wiki/How_to_exchange_large_data_buffers_with_the_coprocessor_-_principle

   5. 화면 업데이트 최적화.

 

 

대표이미지는 Real Time Spectrum Analyzer입니다. 성능으로는 많이 차이가 있으나, 이런 기능도 구현해 보자는 의지로 선택하게 되었습니다.

% 대표이지미 출처 : https://www.rohde-schwarz.com/kr/product/fsw-productstartpage_63493-11793.html

 

 

마지막 Quest 네요. 약 두달이라는 장기간 동안 진행된 챌린지 였지만 재미있고 즐거운 챌린지 였었습니다.

모두 고생 많으셨습니다.

.