Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
307 lines (294 loc) · 21.5 KB
/
Copy pathindex.html
File metadata and controls
307 lines (294 loc) · 21.5 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#0a0f16">
<meta name="description" content="Jinhao Wan — PhD researcher building deep-learning systems for RF-based detection of low-altitude UAVs. Passive sensing, no line of sight, just the spectrum.">
<meta name="keywords" content="RF signal identification, automatic modulation classification, UAV detection, RF fingerprinting, deep learning, software-defined radio, low-altitude security">
<meta name="author" content="Jinhao Wan">
<meta property="og:type" content="website">
<meta property="og:url" content="https://wanjinhao1.github.io/">
<meta property="og:title" content="Jinhao Wan — RF Intelligence for Low-Altitude UAV Detection">
<meta property="og:description" content="Every drone talks. I listen. Deep learning for RF-based detection and identification of low-altitude UAVs.">
<meta property="og:image" content="https://wanjinhao1.github.io/assets/images/social-preview.svg">
<meta name="twitter:card" content="summary_large_image">
<title>Jinhao Wan — RF Intelligence for Low-Altitude UAV Detection</title>
<link rel="canonical" href="https://wanjinhao1.github.io/">
<link rel="icon" href="/assets/images/favicon.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/assets/css/cosmic.css?v=3">
<link rel="stylesheet" href="/assets/css/home.css?v=3">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Jinhao Wan",
"url": "https://wanjinhao1.github.io/",
"jobTitle": "PhD Researcher",
"affiliation": {"@type": "CollegeOrUniversity", "name": "Zhejiang University of Technology"},
"email": "mailto:wanjinhao1@gmail.com",
"sameAs": ["https://github.com/wanjinhao1"]
}
</script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<div class="loader" data-loader aria-hidden="true">
<div class="loader-top"><span>JINHAO WAN</span><span>RF INTELLIGENCE LAB</span></div>
<div class="loader-center"><p data-loader-word>Detect</p><span>RF · SIGNALS · DISCOVERY</span></div>
<div class="loader-count" data-loader-count>000</div>
<div class="loader-progress"><i data-loader-progress></i></div>
</div>
<div class="page-progress" aria-hidden="true"><i data-page-progress></i></div>
<div class="noise" aria-hidden="true"></div>
<header class="site-header" data-header>
<nav class="nav-pill" aria-label="Primary navigation">
<a class="monogram" href="#main" aria-label="Jinhao Wan — home"><span>JW</span></a>
<a class="nav-brand" href="#main">Jinhao Wan<span>RF ∙ UAV</span></a>
<span class="nav-divider" aria-hidden="true"></span>
<div class="nav-links" data-nav-links>
<a class="active" href="#home">Home</a>
<a href="/research/">Research</a>
<a href="/publications/">Publications</a>
<a href="/projects/">Projects</a>
<a href="/explorer/">Explorer</a>
</div>
<span class="nav-divider nav-divider-end" aria-hidden="true"></span>
<button class="command-trigger" data-command-trigger type="button" aria-label="Open site search"><span>Search</span><kbd>⌘K</kbd></button>
<a class="nav-contact" href="mailto:wanjinhao1@gmail.com">Contact ↗</a>
<button class="nav-toggle" type="button" aria-label="Open navigation" aria-expanded="false" data-nav-toggle><span></span><span></span></button>
</nav>
</header>
<main id="main">
<!-- ============ HERO ============ -->
<section class="ts-hero" id="home" aria-labelledby="hero-title">
<div class="ts-hero-grid-bg" aria-hidden="true"></div>
<div class="shell ts-hero-inner">
<div class="ts-hero-copy">
<p class="ts-status reveal"><span class="ts-dot" aria-hidden="true"></span>SDR ONLINE — HANGZHOU, CN<em>·</em><span data-clock>--:--:--</span><em>·</em>UTC+8</p>
<h1 id="hero-title" class="ts-hero-title reveal">Every drone talks.<br><em>I listen.</em></h1>
<p class="ts-hero-lede reveal">I'm Jinhao Wan, a PhD student at Zhejiang University of Technology. My research applies deep learning to RF signal identification, with a focus on detecting low-altitude UAVs from their radio emissions — passive sensing that needs no camera and no line of sight.</p>
<div class="ts-hero-actions reveal">
<a class="ts-btn ts-btn-primary" href="#direction">Research direction <span aria-hidden="true">↓</span></a>
<a class="ts-btn ts-btn-ghost" href="/publications/">Publications <span aria-hidden="true">↗</span></a>
<a class="ts-btn ts-btn-ghost" href="/projects/">Projects <span aria-hidden="true">↗</span></a>
</div>
<p class="ts-hero-meta reveal">2 manuscripts in preparation · open to collaboration · <a href="https://github.com/wanjinhao1" target="_blank" rel="noreferrer">GitHub ↗</a></p>
</div>
<aside class="ts-term ts-hero-term reveal" aria-label="Live RF monitor readout">
<div class="ts-term-bar"><span class="ts-term-dots" aria-hidden="true"><i></i><i></i><i></i></span><span class="ts-term-title">jw@rf-lab — rx-monitor 2.4G</span><span class="ts-term-tag">JW.RF.26.1</span></div>
<div class="ts-term-body">
<p class="ts-term-line ts-term-sys">LOCAL <b data-clock>--:--:--</b> UTC+8 · RX 2.400 GHz ISM · PASSIVE</p>
<p class="ts-term-line ts-term-cmd">> scan --low-altitude --deep-learning<span class="ts-caret" aria-hidden="true"></span></p>
<p class="ts-term-line">SNR <b data-live="snr">+12.6 dB</b><span class="ts-meters" data-meter="snr" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span></p>
<p class="ts-term-line">PWR <b data-live="pwr">−87.4 dBm</b><span class="ts-meters" data-meter="pwr" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span></p>
<p class="ts-term-line">DET <b class="ts-term-hit">uav 0.92</b> · ctrl-link 2.4G</p>
<p class="ts-term-line">ID <b class="ts-term-hit">M3-8K2F</b> · fingerprint 0.87</p>
<p class="ts-term-line ts-term-sys">listening for emitters…</p>
</div>
</aside>
</div>
<a class="ts-scroll-cue" href="#direction"><span>[ 01 ]</span> DIRECTION <i aria-hidden="true"></i></a>
</section>
<!-- ============ TICKER ============ -->
<div class="ts-ticker" aria-label="Research topics"><div class="ts-ticker-track">
<span>RF-BASED UAV DETECTION</span><i>//</i><span>AUTOMATIC MODULATION CLASSIFICATION</span><i>//</i><span>RF FINGERPRINTING</span><i>//</i><span>SIGNAL IDENTIFICATION</span><i>//</i><span>DEEP LEARNING</span><i>//</i><span>SOFTWARE-DEFINED RADIO</span><i>//</i>
<span aria-hidden="true">RF-BASED UAV DETECTION</span><i aria-hidden="true">//</i><span aria-hidden="true">AUTOMATIC MODULATION CLASSIFICATION</span><i aria-hidden="true">//</i><span aria-hidden="true">RF FINGERPRINTING</span><i aria-hidden="true">//</i><span aria-hidden="true">SIGNAL IDENTIFICATION</span><i aria-hidden="true">//</i><span aria-hidden="true">DEEP LEARNING</span><i aria-hidden="true">//</i><span aria-hidden="true">SOFTWARE-DEFINED RADIO</span><i aria-hidden="true">//</i>
</div></div>
<!-- ============ 01 DIRECTION ============ -->
<section class="ts-section" id="direction" aria-labelledby="direction-title">
<div class="shell">
<p class="ts-label reveal"><b>[ 01 ]</b> RESEARCH DIRECTION</p>
<h2 class="ts-h2 reveal" id="direction-title">The opposite way<br>to find a drone.</h2>
<div class="ts-manifesto">
<p class="ts-not reveal" aria-label="not vision">not <s>vision</s><small>cameras · radar · acoustics</small></p>
<div class="ts-manifesto-copy">
<p class="reveal">Most counter-drone systems watch the sky. Cameras need light and a clear line of sight, radar is expensive to deploy at scale, and acoustic sensing breaks down in noisy environments.</p>
<p class="reveal">My approach is <strong>passive RF sensing</strong>. A flying drone is also a radio — its control link, telemetry and video downlink are transmitting the whole time. I train deep networks to read these emissions from raw I/Q samples, so detection works at night, in fog and behind obstacles, and says which emitter is flying rather than just that something is.</p>
<ul class="ts-chips reveal">
<li>no line of sight</li>
<li>24/7 passive</li>
<li>per-device identity</li>
<li>low-cost SDR</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ============ 02 WHY RF ============ -->
<section class="ts-section ts-section-lined" id="pillars" aria-labelledby="pillars-title">
<div class="shell">
<p class="ts-label reveal"><b>[ 02 ]</b> WHY THE SPECTRUM</p>
<h2 class="ts-h2 reveal" id="pillars-title">Three reasons<br>to listen.</h2>
<div class="ts-pillars">
<article class="ts-pillar reveal">
<p class="ts-pillar-tag">[ A ]</p>
<h3>Sensing without sight</h3>
<p>RF detection is passive — it uses only what the drone already radiates. Night, fog and obstacles matter little; the control link is still on the air.</p>
</article>
<article class="ts-pillar reveal">
<p class="ts-pillar-tag">[ B ]</p>
<h3>Identity, not just presence</h3>
<p>RF fingerprints separate models and even individual devices. The answer is not just "a drone is nearby" but which controller, on which link.</p>
</article>
<article class="ts-pillar reveal">
<p class="ts-pillar-tag">[ C ]</p>
<h3>Learning from raw samples</h3>
<p>CNN, ResNet and Transformer models trained end-to-end on raw I/Q and spectrograms, with a focus on low-SNR robustness.</p>
</article>
</div>
</div>
</section>
<!-- ============ 03 INSTRUMENT ============ -->
<section class="ts-section ts-section-lined" id="instrument" aria-labelledby="instrument-title">
<div class="shell">
<div class="ts-section-head">
<div>
<p class="ts-label reveal"><b>[ 03 ]</b> LIVE INSTRUMENT</p>
<h2 class="ts-h2 reveal" id="instrument-title">One signal,<br>four views.</h2>
</div>
<p class="ts-section-note reveal">Four views of the same signal — move the pointer, switch modes, click to scan.<br><a href="/explorer/">Open the full explorer ↗</a></p>
</div>
<div class="ts-term ts-term-instrument reveal">
<div class="ts-term-bar"><span class="ts-term-dots" aria-hidden="true"><i></i><i></i><i></i></span><span class="ts-term-title">rf-explorer — interactive</span><span class="ts-term-tag" data-world-status>RF signal clusters</span></div>
<div class="ts-instrument-stage" role="img" aria-label="An interactive RF signal-intelligence scene with four research modes">
<canvas data-spatial-world data-scene="hero" data-mode="features" aria-hidden="true"></canvas>
<p class="ts-instrument-readout"><strong data-world-title>Signal feature space</strong><span data-world-detail>Move to reveal classes · click to probe the spectrum</span><span class="semantic-legend" aria-label="Signal class colours"><i class="building"></i>PSK <i class="vegetation"></i>OFDM <i class="road"></i>Noise <i class="vehicle"></i>UAV</span></p>
</div>
<div class="ts-instrument-modes" role="group" aria-label="Visualization mode">
<button class="active" data-world-mode="features" type="button" aria-pressed="true"><i>01</i><span>Feature space</span></button>
<button data-world-mode="constellation" type="button" aria-pressed="false"><i>02</i><span>IQ constellation</span></button>
<button data-world-mode="spectrum" type="button" aria-pressed="false"><i>03</i><span>Spectrum</span></button>
<button data-world-mode="detection" type="button" aria-pressed="false"><i>04</i><span>UAV detection</span></button>
</div>
</div>
</div>
</section>
<!-- ============ 04 RESEARCH ============ -->
<section class="ts-section ts-section-lined" id="research" aria-labelledby="research-title">
<div class="shell">
<div class="ts-section-head">
<div>
<p class="ts-label reveal"><b>[ 04 ]</b> RESEARCH</p>
<h2 class="ts-h2 reveal" id="research-title">Four connected<br>directions.</h2>
</div>
<p class="ts-section-note reveal">From identifying the modulation on the wire to finding the drone behind it.<br><a href="/research/">Open the research atlas ↗</a></p>
</div>
<div class="ts-rows">
<a class="ts-row reveal" href="/research/#signal-id"><span class="ts-row-num">01</span><span class="ts-row-body"><strong>RF Signal Identification</strong><small>Modulation type and signal class, straight from raw I/Q samples.</small></span><span class="ts-row-tag">categorize the spectrum</span><span class="ts-row-arrow" aria-hidden="true">→</span></a>
<a class="ts-row reveal" href="/research/#uav-detection"><span class="ts-row-num">02</span><span class="ts-row-body"><strong>UAV Detection</strong><small>Finding and recognizing drones from their RF emissions, down to per-device fingerprints.</small></span><span class="ts-row-tag">find the emitter</span><span class="ts-row-arrow" aria-hidden="true">→</span></a>
<a class="ts-row reveal" href="/research/#dl-rf"><span class="ts-row-num">03</span><span class="ts-row-body"><strong>Deep Learning for RF</strong><small>CNN, ResNet and Transformer architectures that turn waveforms into decisions.</small></span><span class="ts-row-tag">learn from waveforms</span><span class="ts-row-arrow" aria-hidden="true">→</span></a>
<a class="ts-row reveal" href="/research/#robust-recognition"><span class="ts-row-num">04</span><span class="ts-row-body"><strong>Robust Recognition</strong><small>Accuracy that survives low SNR, fading and lab-to-field distribution shift.</small></span><span class="ts-row-tag">hold up under noise</span><span class="ts-row-arrow" aria-hidden="true">→</span></a>
</div>
</div>
</section>
<!-- ============ 05 PUBLICATIONS ============ -->
<section class="ts-section ts-section-lined" id="publications" aria-labelledby="pubs-title">
<div class="shell">
<div class="ts-section-head">
<div>
<p class="ts-label reveal"><b>[ 05 ]</b> PUBLICATIONS</p>
<h2 class="ts-h2 reveal" id="pubs-title">Selected work.</h2>
</div>
<p class="ts-section-note reveal">Two manuscripts in preparation, more as the work matures.<br><a href="/publications/">Search the full library ↗</a></p>
</div>
<div class="ts-pubs">
<article class="ts-pub reveal">
<div class="ts-pub-meta"><span class="ts-pub-status">IN PREP.</span><span>2025</span><span>MANUSCRIPT</span></div>
<h3><a href="/projects/rf-detection/">Deep learning for automatic modulation classification of RF signals.</a></h3>
<p>Convolutional and transformer models that classify the modulation type of received signals from raw I/Q samples, with an emphasis on robustness at low SNR.</p>
<div class="ts-pub-foot"><span class="ts-pub-author">Jinhao Wan</span><span class="ts-pub-links"><a href="/projects/rf-detection/">Project ↗</a><a href="/publications/">BibTeX ↗</a></span></div>
</article>
<article class="ts-pub reveal">
<div class="ts-pub-meta"><span class="ts-pub-status">IN PREP.</span><span>2025</span><span>MANUSCRIPT</span></div>
<h3><a href="/projects/rf-detection/">RF-based detection and recognition of unmanned aerial vehicles.</a></h3>
<p>Detecting and identifying small UAVs from their RF emissions using SDR captures and deep classifiers, including fingerprinting of individual devices.</p>
<div class="ts-pub-foot"><span class="ts-pub-author">Jinhao Wan</span><span class="ts-pub-links"><a href="/projects/rf-detection/">Project ↗</a><a href="/publications/">BibTeX ↗</a></span></div>
</article>
</div>
<p class="ts-more reveal"><a class="ts-btn ts-btn-ghost" href="/publications/">Open searchable library <span aria-hidden="true">↗</span></a></p>
</div>
</section>
<!-- ============ 06 PLAN ============ -->
<section class="ts-section ts-section-lined" id="plan" aria-labelledby="plan-title">
<div class="shell">
<div class="ts-section-head">
<div>
<p class="ts-label reveal"><b>[ 06 ]</b> WHAT'S NEXT</p>
<h2 class="ts-h2 reveal" id="plan-title">The road ahead.</h2>
</div>
<p class="ts-section-note reveal">Three phases, plus a running log.</p>
</div>
<div class="ts-plan">
<div class="ts-phases">
<article class="ts-phase reveal"><p class="ts-phase-tag">NOW</p><h3>Foundations</h3><p>Modulation classification and RF identification on SDR captures. First manuscript in preparation.</p></article>
<article class="ts-phase reveal"><p class="ts-phase-tag">NEXT</p><h3>Detection in the wild</h3><p>UAV detection and per-device fingerprinting under real channels; field captures around campus.</p></article>
<article class="ts-phase reveal"><p class="ts-phase-tag">THEN</p><h3>Robust systems</h3><p>Lab-to-field generalization, low-SNR robustness, deployable low-cost SDR pipelines.</p></article>
</div>
<div class="ts-log reveal" aria-label="Lab log">
<p class="ts-log-title">LAB LOG</p>
<ul>
<li><time>2026.08</time><span><strong>Portfolio relaunch</strong> — site rebuilt as an RF research lab notebook.</span></li>
<li><time>2026</time><span><strong>Research focus</strong> — deep learning for RF signal identification and low-altitude UAV detection.</span></li>
<li><time>2026</time><span><strong>In preparation</strong> — AMC and UAV RF-fingerprinting manuscripts underway.</span></li>
</ul>
<a class="ts-log-more" href="/research/#timeline">View full timeline <span aria-hidden="true">↗</span></a>
</div>
</div>
</div>
</section>
<!-- ============ CONTACT + FOOTER ============ -->
<section class="ts-contact" id="contact" aria-labelledby="contact-title">
<div class="shell">
<p class="ts-label reveal"><b>[ 07 ]</b> CONTACT</p>
<h2 class="ts-contact-title reveal" id="contact-title">Get in touch.</h2>
<p class="ts-contact-sub reveal">Questions, ideas, or collaboration on RF sensing and UAV detection are all welcome.</p>
<a class="ts-email reveal" href="mailto:wanjinhao1@gmail.com">wanjinhao1@gmail.com<span aria-hidden="true">↗</span></a>
</div>
<footer class="site-footer shell">
<div class="footer-links"><a href="https://github.com/wanjinhao1" target="_blank" rel="noreferrer">GitHub ↗</a><a href="mailto:wanjinhao1@gmail.com">Email ↗</a><a href="/publications/">Publications ↗</a><a class="template-origin" href="https://github.com/zhuqinfeng1999/interactive-academic-portfolio" target="_blank" rel="noreferrer">Spatialfolio template ↗</a></div>
<div class="footer-meta"><span>© <span data-year>2026</span> Jinhao Wan · Hangzhou, China</span><a href="#main">Back to top ↑</a></div>
</footer>
</section>
</main>
<script src="/assets/js/cosmic.js?v=3" defer></script>
<script src="/assets/js/spatial-world.js?v=3" defer></script>
<script>
/* Terminal readouts: live clock + SNR/PWR jitter. */
(() => {
'use strict';
const pad = (n) => String(n).padStart(2, '0');
const tickClock = () => {
const now = new Date();
const text = `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
document.querySelectorAll('[data-clock]').forEach((node) => { node.textContent = text; });
};
tickClock();
window.setInterval(tickClock, 1000);
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
let snr = 12.6, pwr = -87.4;
const meters = { snr: [], pwr: [] };
document.querySelectorAll('[data-meter]').forEach((group) => { meters[group.dataset.meter] = [...group.children]; });
const paint = (key, value) => {
const ratio = key === 'snr' ? Math.min(Math.max((value + 4) / 34, .12), 1) : Math.min(Math.max((value + 104) / 34, .12), 1);
meters[key].forEach((bar, index) => {
const on = index / meters[key].length < ratio;
bar.classList.toggle('on', on);
});
};
window.setInterval(() => {
snr = Math.min(Math.max(snr + (Math.random() - .5) * 1.6, 2), 28);
pwr = Math.min(Math.max(pwr + (Math.random() - .5) * 2.2, -102), -74);
const snrNode = document.querySelector('[data-live="snr"]');
const pwrNode = document.querySelector('[data-live="pwr"]');
if (snrNode) snrNode.textContent = `+${snr.toFixed(1)} dB`;
if (pwrNode) pwrNode.textContent = `−${Math.abs(pwr).toFixed(1)} dBm`;
paint('snr', snr); paint('pwr', pwr);
}, 900);
})();
</script>
</body>
</html>