A presentation for Kichijoji.pm 20, Freakout Holdings, Inc., Minato-ku, Tokyo, Japan, 22-NOV-2019
ιϑτΣΞϥδΦͱC++ 1ͦͯ͠FMΤΞνΣοΫͷͨΊͷ৴߸ղੳͱܭࢉʹ·ͭΘΔΑ·1 ͜ͷൃදͰͷC++C++11Ҏ߱ͷ༷Λલఏͱ͍ͯ͠·͢ɻKenji Rikitake / Kichijoji.pm 20 1
View Slide
Kenji RikitakeΓ͖͚ͨ ͚Μ͡ྗ ݈࣍22-NOV-2019kichijoji.pm 20Freakout Holdings, Inc.Minato-ku, Tokyo, Japan@jj1bdxKenji Rikitake / Kichijoji.pm 20 2
ٕज़࢜ʢใֶ෦ʣྗ݈ٕ࣍ज़࢜ࣄॴ ॴใॲཧ҆શ֬อࢧԉ࢜ϖύϘݚڀॴ ٬һݚڀһୈҰڃ্ແઢٕज़࢜ୈҰڃΞϚνϡΞແઢٕ࢜ΞϚνϡΞແઢྺ 438ϲ݄Cྺ 33ɺC++11ྺ ͨͬͨͷ3ຊݚڀͷϖύϘݚڀॴͷ͝ࢧԉʹਂ͘ײँ͠·͢Kenji Rikitake / Kichijoji.pm 20 3
Kenji Rikitake / Kichijoji.pm 20 4
1970ྲྀߦͬͨFMΤΞνΣοΫFM์ૹԻָͷࢁͩͬͨࢲ͍ͬͺ͍ϥδΧη2ͰԻͯ͠·ͨ͠ʢ2019ͷࠓͰԻ͍ͯ͠Δਓୡ͍ͬͺ͍͍·͢ʣ2 Puding Jahodový, Public domain, h4ps://commons.wikimedia.org/wiki/File:Sharp_5P-37G_wiki.jpg, via WikimediaCommonsKenji Rikitake / Kichijoji.pm 20 5
Kenji Rikitake / Kichijoji.pm 20 6
21ੈلͷϥδΦιϑτΣΞUSBσόΠε3ͰपมͱଳҬ੍ݶมͨ͠৴߸ ιϑτΣΞ Ͱॲཧίʔυ͕ॻ͚Ε͋ͳͨϥδΦ͕࡞ΕΔ!ΤΞνΣοΫͨ͠MP3ϑΝΠϧεϚϗͰฉ͖์!3 Photo of Airspy HF+ Dual Port by Kenji RikitakeKenji Rikitake / Kichijoji.pm 20 7
पมͱଳҬ੍ݶͷྫ82.5MHzΛத৺ͱ͢ΔFM์ૹͷ߹82.308MHz - 82.692MHz↓-0.192MHz - 0.192MHz±192kHzͷ384kHz෯ͷ৴߸ʹมKenji Rikitake / Kichijoji.pm 20 8
ෛͷप࣮ͷ৴߸:࣮ࡍͷՄೳੑ(1):࣮ࡍͷՄೳੑ(2):ཧ༝:…ͳͷͰ࣮ͷ৴߸͚ͩͰ৴߸ͷҐ૬ΛಛఆͰ͖·ͤΜෛͷपΛߟ͑ͯΔඞཁ͕͋Γ·͢Kenji Rikitake / Kichijoji.pm 20 9
IQ৴߸: ࣮৴߸Λෳૉʹม࣮ͷ৴߸: ͔ΒҎԼͷ৴߸Λੜ͠·͢ରԠ͢ΔIQ৴߸:ͨͩ͠ ʢͳͥ͜Ε͕ Ͱͳ͍͔ͱ͍͏ͱిؾͰ ిྲྀͷҙຯͳͷͰ͢ʣ͜ΕΛॻ͖͢ͱ ʢۃ࠲ඪʣI৴߸ʢ࣮෦ʣ:Q৴߸ʢڏ෦ʣ:Kenji Rikitake / Kichijoji.pm 20 10
IQ৴߸ͩͱԿ͕͏Ε͍͔͠IQ৴߸:std::complex IQsample ͱͯ͠ఆٛ৴߸ͷৼ෯ std::abs(IQsample)৴߸ͷҐ૬ std::arg(IQsample)std::arg(z) = std::atan2(z.imag(), z.real())AM์ૹͳΒ ͦͷͷɺFM์ૹͳΒ Λඍ͢Ε෮ௐͰ͖ΔKenji Rikitake / Kichijoji.pm 20 11
50લͷFM์ૹ։͔࢝࣌Βͷ·͍͠:FMͷ࣭Լ͛ΔϚϧνύεKenji Rikitake / Kichijoji.pm 20 12
Ϛϧνύεෳܦ࿏Λ௨Δిͷׯবৼ෯Ґ૬͕มԽͯ͠ΉҐ૬͕ΉͱFM์ૹͩͱͱͯෆշͳԻ͕͢ΔैདྷͷରԠ: ΞϯςφͷࢦੑͷมԽ͙Β͍͔͠Ͱ͖ͳ͔ͬͨKenji Rikitake / Kichijoji.pm 20 13
ϚϧνύεͰຊདྷͳ͍৴߸͕ݟ͑Δྫ44 Lithium57, English transla3on: MichaelBillington, h:ps://commons.wikimedia.org/wiki/File:Mul3path_propaga3on_diagram_en.svg from Wikimedia Commons, public domainKenji Rikitake / Kichijoji.pm 20 14
ϚϧνύεʹΑΔৼ෯ͷมԽ55 Audacity simula.on and graphics by Kenji RikitakeKenji Rikitake / Kichijoji.pm 20 15
ϚϧνύεԆͷΈࠐΈ66 I, Cantalamessa, h.ps://commons.wikimedia.org/wiki/File:Mul>path_impulse_response.png from WikimediaCommons, licensed CC BY 2.5Kenji Rikitake / Kichijoji.pm 20 16
ԆΛϞσϦϯάͯ͠ٯԋࢉ͢ΔFM৴߸: ৼ෯ҰఆɺҐ૬/पͷΈมԽৼ෯ͷมԽ→৴߸͕ΜͰ͍ΔมԽͨ͠ৼ෯Λ͢Α͏ͳΈࠐΈΛड৴ଆͰͬͯ͠·͑Α͍ʢLeast Mean Square / Constant Modulus AlgorithmʣKenji Rikitake / Kichijoji.pm 20 17
ٯԋࢉͷͨΊͷFIRϑΟϧλ (airspy-fmradion)using IQSample = std::complex;using IQSampleVector = std::vector;inline IQSample MultipathFilter::single_process(const IQSample filter_input) {m_state.emplace_back(filter_input);m_state.erase(m_state.begin());IQSample output = IQSample(0, 0);// for (unsigned int i = 0; i < m_filter_order; i++) {// output += m_state[i] * m_coeff[i];// }volk_32fc_x2_dot_prod_32fc(&output, m_state.data(), m_coeff.data(),m_filter_order);return output;}Kenji Rikitake / Kichijoji.pm 20 18
Vector Op*mized Library of Kernels (VOLK)x86/ARMͷ৴߸ॲཧͷͨΊͷϥΠϒϥϦSIMD໋ྩͰΧϦΧϦͷϋϯυνϡʔχϯάh"p://libvolk.org/ʢFM෮ௐઐ༻ͷ͕ؔ͋ͬͨΓ͢Δ͘Β͍ΨνͰ͢ʣKenji Rikitake / Kichijoji.pm 20 19
ྗͷGPLv3࣮ = airspy-fmradionh"ps://github.com/jj1bdx/airspy-fmradionͱͱSo#FMͱ͍͏FMड৴ઐ༻ػࠓதAM/FM/SSB/CWͳΜͰ͟͝ΕʹਐԽ͓ͦΒ͘ੈքॳͷOSSͰ࣮ͨ͠ϚϧνύεϑΟϧλmacOSͱLinuxͱRaspberry PiͰಈ͖·͢ʢGUIෆಘҙͳͷͰʣίϚϯυϥΠϯπʔϧ Ͱ͢Kenji Rikitake / Kichijoji.pm 20 20
࠷ޙʹҰ۟ౙͷʹཕΛ͑Δిʢౙͷʹ֤Ͱൃੜ͢Δཕ͕ిΛհͯ͠த์ૹ3.9MHzʢ75mόϯυʣͷ์ૹͰຊதʹ͘·ͳ͘ΘΔ༷Λࣔͨ͠Ұ۟ɻͳ͓ɺཕʢΒ͍ʣຊདྷՆͷقޠɻʣKenji Rikitake / Kichijoji.pm 20 21
ܾҙද໌2020ʹ౦ژʹͬͨΒؤுͬͯͬͱՔ͍ͰΑΓΑ͍ݚڀͱٕज़Ͱࣾձʹߩݙ͠·͢Kenji Rikitake / Kichijoji.pm 20 22
Thank youQues%ons?Kenji Rikitake / Kichijoji.pm 20 23