ASK feature 개발 #85
Replies: 12 comments 22 replies
-
감사합니다! 👍 추가로 조사해서 공유하도록 하겠습니다! |
Beta Was this translation helpful? Give feedback.
-
자료 공유 감사드립니다!! |
Beta Was this translation helpful? Give feedback.
-
코드를 읽어보면서 모르는 부분을 간단하게 정리해보았습니다!
|
Beta Was this translation helpful? Give feedback.
-
@euphony-io/euphoria
modulate 함수 구현은 공부하면서 사소하게라도 알게 된 내용이 있다면 코멘트 올려주세요!! |
Beta Was this translation helpful? Give feedback.
-
스마트 포인터잘 모르지만, 얕은 지식으로 떠듬떠듬 적어 봅니다. 추가할 내용 있으시면 추가 해 주세요. c, c++ 은 포인터를 통해서 직접 memory에 access 합니다. 그렇기 때문에 그리고 malloc이나 new 연산자로 생성된 객체들은 해당 메모리를 직접 해제 해 주지 않으면 사용하지 않는 메모리가 남습니다.(memory leak) 그리고 현재 가르키고 있는 객체를 잘못 생성해 버리면, 포인터 객체가 가르키고 있는 객체가 없어지는 에러가 생기게 됩니다. (dangling pointer) 즉,
위와 같은 메모리 사용 문제를 스마트 포인터를 사용하면 자동적으로 해결해 주기 때문에, raw pointer를 쓰는 것 보다 raw pointer를 스마트 포인터에 대입해서 사용합니다. euphony 라이브러리에서도 두가지의 스마트 포인터가 사용되더라구요. shared_pointer, unique_pointer 스마트 포인터 덕분에 코드내에 따로 destruct 하는 부분도 보이지 않구요. 일단 unique포인터에 대해 알아보겠습니다. unique_pointer간단하게 말씀드리자면, 하나의 객체에 하나의 포인터만 대입 할 수 있다 입니다. move를 통해 소유권을 이전할 수 있지만, 복사할 수 없습니다. memory leak를 예방 할 수 있겠네요. 왜냐하면 메모리 누수 같은 경우에는 하나의 객체에 여러가지 포인터를 참조하다가 하나의 포인터에서 해제 명령을 내리는 경우 발생 하는데, unique_pointer를 사용하면 하나의 객체에 하나의 포인터만 적용할 수 있기 때문에 memory leak가 발생하는 경우는 없겠네요. euphony 코드를 볼게요 private:
std::unique_ptr<FFTModel> fftModel FFTModel의 경우에는 하나의 객체를 생성하면 여러 포인터가 가르킬 일 없으니까 unique포인터로 지정 해 둔 모습을 보입니다. fft = std::make_unique<FFTProcessor>(inputFFTSize, inputSampleRate); test code 내에서 테스트 객체를 생성할 때도 make_unique함수를 사용해 unique 포인터를 생성하는 것을 알 수 있습니다. 유니크 포인터로 객체를 생성하면 매모리 해제 또한 자동으로 해 주기 때문에 그 이점때문에 스마트 포인터를 쓰려면 그냥 유니크 포인터로 객체를 생성하면 됩니다. shared_pointer이것은 하나의 객체에 여러개의 포인터를 가르킬 수 있지만, shared_pointer자체에서 객체에 가르키는 pointer의 수를 세기 때문에 객체를 가르키는 pointer의 수가 0가 되면 해당 객체를 해제 합니다. dangling pointer를 예방 할 수 있겠네요. std::shared_ptr<Packet> demodulate(const WaveList& waveList); Packet의 벡터, 즉 HexVector 같은 경우 하나의 객체가 여러개의 포인터를 가르켜야 할 일이 있는 것 같습니다. 그래서 shared_pointer를 쓴 것 같습니다. |
Beta Was this translation helpful? Give feedback.
-
@euphony-io/euphoria
|
Beta Was this translation helpful? Give feedback.
-
유포니 라이브러리 내의 여러 gtest 코드들을 읽어보고 자주 보이는 명령어, 기능들을 간단하게 정리해보았습니다. XX 클래스마다 이름을 다르게 짓는 것을 생각해서 임의로 넣은 것이고, 명령어 뒤에 오는 X는 그 뒤에 들어오는 다양한 기능들이 있다는 것을 표시한 것입니다! class XXTestFixture : public ::testing::TestWithParam ASSERT_X: 어설션이 실패할 경우 프로그램 실행을 중단함 EXPECT_EQ: 두 값이 같기를 기대하는 메서드 TEST_P: 테스트 픽스처 클래스에서 사용하는 테스트 패턴을 정의함. 테스트 픽스처 클래스를 의미하는 TEST_P(TestFixtureName, TestName) {
... statements ...
} INSTANTIATE_TEST_SUITE_P: 테스트 케이스인 TestParamType들을 선언하고 테스트를 확인하도록 함 |
Beta Was this translation helpful? Give feedback.
-
FSK 테스트코드에서 테스트 패턴을 정의하는 TEST_P 부분을 살펴봅시다. euphony/euphony/src/main/cpp/tests/FSKTest.cpp Lines 32 to 47 in c1bb8f4 테스트 파라미터 형식과 작성std::tie(inputCode, expectedCodeLength, expectedFreqIndex) = GetParam(); 위와 같이 파라미터를 받아서 테스트하는것을 알 수 있습니다. 따라서 테스트케이스도 아래와 같이 작성하면됩니다. TestParamtype(inputCode, expectedCodeLength, expectedFreqIndex) 무엇을 테스트하는가?TEST_P 에서는 2개의 EXPECT_EQ 메서드로 테스트가 이루어집니다. auto modulateFSK = fsk->modulate(inputCode);
EXPECT_EQ(modulateFSK.size(), expectedCodeLength); auto demodulateResult = fsk->demodulate(modulateFSK);
EXPECT_EQ(inputCode, demodulateResult->getPayloadStr()); 3번째 파라미터인 expectedFreqIndex 에 대한 테스트는 수행되지 않고 있습니다. 실제 테스트케이스 예시FSKTest.cpp의 첫번째 테스트 케이스입니다.
ASK의 테스트케이스TestParamtype("0", 1, 0),
TestParamtype("1", 1, 1),
TestParamtype("01", 2, 0),
TestParamtype("1101", 4, 0),
TestParamtype("1010111000", 10, 0) 위와 같이 첫번째에는 0이나1 문자로 이루어진 inputCode, 두번째에는 inputCode의 길이를 넣어주면됩니다. 세번째 파라미터는 무시해도 좋습니다. 일단 임의의 값을 넣어놓으면 될것입니다. 혹은, TEST_P에서 위 라인을 다음과 같이 수정합니다. std::tie(inputCode, expectedCodeLength) = GetParam(); 그리고 테스트케이스를 TestParamtype("0", 1),
TestParamtype("11", 2) 위와 같이 작성하면 될 것입니다. |
Beta Was this translation helpful? Give feedback.
-
Amplitude를 어떻게 설정할까요?FSK에서는...euphony/euphony/src/main/cpp/core/source/FSK.cpp Lines 19 to 34 in c1bb8f4 FSK클래스의 modulate 메서드의 일부분입니다. 파라미터 string code를 받아서 for (char c : code ) code의 문자마다 char c로 for문이 돌아갑니다. 하나의 문자 c마다 하나의 Wave가 생성됩니다. c의 값에 따라서 case문으로 분기하고 .vibratesAt() 메서드로 frequency값을 설정합니다. (Frequency Shift) Amplitude 속성은 어디에?ASK도 FSK처럼 modulate 메서드안에서 문자에 따라서 amplitude를 설정하면 되겠죠? euphony/euphony/src/main/cpp/core/Wave.h Lines 40 to 49 in c1bb8f4 그런데 Wave.h를 살펴보면 진폭에 관한 속성이 정의돼있지 않습니다. 그냥 mAplitude 속성을 추가하면 되는걸까요? 참고유포니 프로젝트내에서 amplitude 키워드를 검색해보면 EuPIOscillator와 Oscillator에서는 진폭을 다루고있네요. 근데 Wave클래스와는 연결점이 없는것 같습니다. ASK를 개발하는데 상관이 있는지 모르겠네요. |
Beta Was this translation helpful? Give feedback.
-
너무 길어져서 새로운 discussion으로 분리했습니다! |
Beta Was this translation helpful? Give feedback.
-
ASK feature에 관해 같이 공부해보고 개발하기 위해 자유롭게 상의하고자 디스커션 남깁니다:)
좋은 자료 있으면 서로 공유하고 같이 이야기 나누면 좋을 것 같습니다!!
ASK를 이해하는 데 좋은 짧은 동영상이 있어 함께 공유합니다!
Beta Was this translation helpful? Give feedback.
All reactions