第一篇文章我本打算用python写代码并使用rtlsdr来接收,这样不但代码简洁好懂,而且设备也非常便宜,很好入门。但是第二篇文章我为了尽早实现效果还是采用了c++语言和hackrf。可能会对入门者不太友好,所以这两天我继续做python+rtlsdr的版本。现在已经初有成效了
from pylab import *
from rtlsdr import *
import cv2
sdr = RtlSdr()
# configure device
sdr.sample_rate = 1.951047e6
sdr.center_freq = 395.991e6
sdr.gain = 60
# init for opencv
x = 0
y = 0
img=np.zeros((512,512,1), np.uint8)
while True:
samples = sdr.read_samples(1024*100) #type(sample) is numpy.complex128
for sample in samples:
mag = np.sqrt( sample.imag * sample.imag + sample.real * sample.real)
value = mag * 255 * 10
img[y, x] = value
x = x + 1
if (x >= 463):
x = 0
y = y + 1
if (y >= 500):
y = 0
cv2.imshow("HDMI", img)
if(cv2.waitKey(10)==27):
break
sdr.close()
以上是我的代码,一共才30多行,十分简洁。可以用python2.7运行。
当rtlsdr在hdmi线缆附近时,效果如下:
这是泄漏电脑的桌面:
可以看得出他们是比较呼应的——总体界面都是黑色,上面都有一条白色横条,然后左边有一条垂直白色矩形,右边还有一个小的白色矩形。
但是目前还有两个问题
1.解出来的图像有一点倾斜(这个问题可以通过调整换行位置463改善,但是由于换行位置必须整形数,所以精度有限)
2.窗口中重复出现了很多个比较小的画面,最好把画面放大一些,没必要那么看到那么多重复画面,这个也好解决,只需要在图像绘制阶段把1个像素点扩展为上下左右好几个像素点就行。
后面我会找时间慢慢优化。
下面是两幅实景照片,你可以比较两个电脑屏幕的关系。我的操作是在移动泄露电脑屏幕右侧的白色文本输入界面。