相位偏移调制
相位偏移调制,又称移相键控(PSK,Phase Shift Keying)是一种利用相位差异的信号来传送资料的调制方式。该传送信号必须为正交信号,其基底更须为单位化信号。
继续阅读相位偏移调制
参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境搭建实验环境的时候,只能使用LimeSDR v17.06.0
的驱动,更新版本的的驱动,运行之后,手机设备不能正确的连接到建立的基站。
继续阅读解决ubuntu 16.04系统上2017.06版本之后的LimeSDR V1.4驱动不能正常运行OpenAirInterface搭建的LTE实验环境的问题
1) TM1,单天线端口传输:主要应用于单天线传输的场合。
2) TM2,发送分集模式:适合于小区边缘信道情况比较复杂,干扰较大的情况,有时候也用于高速的情况,分集能够提供分集增益。
3) TM3,开环空间分集:合适于终端(UE)高速移动的情况。
4) TM4,闭环空间分集:适合于信道条件较好的场合,用于提供高的数据率传输。
5) TM5,MU-MIMO传输模式:主要用来提高小区的容量。
6) TM6,Rank1的传输:主要适合于小区边缘的情况。
7) TM7,Port5的单流Beamforming模式:主要也是小区边缘,能够有效对抗干扰。
8) TM8,双流Beamforming模式:可以用于小区边缘也可以应用于其他场景。
9) TM9,传输模式9是LTE-A中新增加的一种模式,可以支持最大到8层的传输,主要为了提升数据传输速率。
TDD 配比2下的TM9,在0 1 5 6子帧调度最大是88RB,3 4 8 9子帧调度最大100RB。
开环”,即发射端无法获得信道信息的条件下使用
空间复用是为了提高传输数据数量; 传输分级是为了提高传输数据质量;
TM3与TM4的区别:
对于TM3,预编码不依赖于UE上报的建议使用的预编码矩阵(即UE不上报PMI),eNodeB和UE使用相同的方式从一个预先定义的集合中选择一个预编码矩阵。
注:
1、《技术规范》P.38页中的“发送分集”,即是《系统设计》P.158中的“传输分集”,二者是一个意思。
2、传输模式即是《技术规范》P.38页中的“MIMO模式”。
最近收到招商银行香港银行的短信:
1 |
尊敬的客户,您的香港一卡通已超过18个月无主动交易,请于xx年xx月xx日前办理一笔交易以保持账户活动。 |
查询了一下,根据香港的规定,"账户连续两年内没有任何主动交易,则账户自动转为冻结状态,成为“睡眠户”,该类账户不允许进行出款交易。若您需要重新恢复该账户的使用,需要您填妥解除睡眠户表格寄送给香港分行审批,审批通过后,香港分行会主动联系您,核实后可以解除。"
以前总是傻傻的进行一次国内的转账操作,每次都被收高昂的手续费。今天终于想明白了,只要进行交易都算,那么干脆做一笔最小的活期转定期的存款,比如100
块美金的一周定期,就搞定了。
最近(2021/03),上述的办法已经不行了,最近会收到如下信息:
1 |
您的相关一卡通长期未有网银转账,请您于xx月xx日前通过香港专业版完成一笔转出交易,避免限额清零,详情可咨询95555 |
比较简单的方式是找同事要一下账号,同行转出1分钱即可,也可以给慈善机构捐款,还是转账一分钱最简单。
另外,若网银每日限额已经被清零,可能收到如下短信通知:
1 |
您的香港一卡通长期未有网银转账,现香港专业版限额已被清零,您可于一个月内通过香港专业版-其他功能-限额管理复原,详情可咨询95555 |
可以登录香港专业版,可以使用“复原网银限额”复原到最近一次的网银限额;只有一个月内复原,才有效果。
微软曾经为macOS
提供过Windows
远程桌面,但是已经非常长时间没有更新过了,导致在macOS High Sierra
系统上的远程桌面是无法连接Windows 10
的。
其实微软还是为最新的macOS High Sierra
提供了远程桌面程序的,在苹果应用商店的应用名为Microsoft Remote Desktop Beta
,但是遗憾的是,设置了只能美国的用户才能下载。因此我们需要手工下载,然后安装。
可以在本站下载一份目前的最新拷贝。
这是最好的时代,也是最坏的时代。
生活在科技大爆发的时代里,你是否感觉到一丝庆幸? 虚拟现实、自动驾驶,无数令人血脉偾张的新型应用正在井喷式地爆发,模糊了虚拟和现实的边界,并深刻地改变着我们触碰和认知世界的方式。
而这,对于通信人而言却是一场艰苦卓绝的战斗。
继续阅读5G通信技术解读|大规模天线阵列技术
在之前的文章(《如何实现比4G快十倍?毫米波技术是5G的关键》)中我们介绍了如何利用毫米波技术获得更多的频谱资源,接下来的问题是如何充分利用这些频谱资源——如何让多个用户通讯但又互不干扰,专业术语叫做频谱复用。
最近公司的一台使用华硕B150M-ET/V5
主板的机器,在插拔USB
设备的时候,一定概率会出现总线故障,导致全部的USB
设备丢失,此时跟内核死机没有太大的区别,全部的鼠标键盘都不能使用了。通过SSH
远程登录上去,可以看到如下日志:
1 2 3 4 5 6 |
$ dmsg .......... [193406.749081] xhci_hcd 0000:00:14.0: xHCI host not responding to stop endpoint command. [193406.749098] xhci_hcd 0000:00:14.0: xHCI host controller not responding, assume dead [193406.749120] xhci_hcd 0000:00:14.0: HC died; cleaning up .......... |
这个问题初步判断是主板BIOS
的BUG
,解决方法就是升级BIOS
。
目前最新的BIOS
为B150M-ET-ASUS-3606
日期为02/21/2018
发布的版本。
目前官方网站上的页面中没有这个固件的链接地址,用BIOS
自带的在线升级工具可以升级到这个版本。
官方版本的下载地址为:
https://dlsvr04.asus.com/pub/ASUS/mb/LGA1151/B150M-ET/B150M-ET-ASUS-3606.zip
如果官方下载存在问题,可以在本站下载一份拷贝:
B150M-ET-ASUS-3606
使用gnuradio
播放自己的音乐,安装必要的软件
1 2 3 4 5 |
$ sudo apt-get install hackrf $ sudo apt-get install gr-osmosdr $ sudo apt-get install gnuradio |
点击展开代码,保存为wbfm_tx_hackrf.grc
,然后双击打开
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 |
#安装预编译版本,为后续编译减少依赖,预编译版本太老了 $ sudo apt-get install libarmadillo-dev $ cd ~ #编译安装最新版本的armadillo,gr-doa需要这个库的支持 $ git clone https://github.com/conradsnicta/armadillo-code.git $ cd armadillo-code $ mkdir build $ cd build $ cmake .. $ make $ sudo make install #编译安装SoapySDR,为我们后续操作LimeSDR准备操作接口 $ cd ~ $ git clone https://github.com/pothosware/SoapySDR.git $ cd SoapySDR $ git pull origin master $ mkdir build && cd build $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig #编译安装GrOsmoSDR,后续为了支持GnuRadio,我们需要GrOsmoSDR帮我们完成一个中转 $ cd ~ $ git clone git://git.osmocom.org/gr-osmosdr $ cd gr-osmosdr #修正几处问题 $ sed -i '$a\from _osmosdr_swig import source_IQBalanceOff' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceManual' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceAutomatic' ./python/__init__.py $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig #编译安装LimeSDR的驱动 $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite #建议2018年4月以后的的主分支,早期版本存在相位随时间漂移的问题 $ git checkout master # 不可删除build目录,清理build目录后要还原被误删除的文件, # 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备 $ mkdir build ; cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig $ cd ../udev-rules/ $ sudo ./install.sh # Download board firmware $ sudo LimeUtil --update |
gr-doa
源代码
1 2 3 4 |
#编译安装gr-doa $ cd ~ $ git clone https://github.com/EttusResearch/gr-doa.git |
增加limesdr
的调用代码:
1 2 3 4 5 |
$ sed -i "s/__init__.py/__init__.py\nlimesdr_soapysdr_source.py/g" ~/gr-doa/python/CMakeLists.txt $ sed -i "s/from twinrx_usrp_source import twinrx_usrp_source/from twinrx_usrp_source import twinrx_usrp_source\nfrom limesdr_soapysdr_source import limesdr_soapysdr_source/g" ~/gr-doa/python/__init__.py $ vim ~/gr-doa/python/limesdr_soapysdr_source.py |
具体代码如下:
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 |
# -*- coding: utf-8 -*- # # Copyright 2018 # longsky <wangqiang1588@sina.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # from gnuradio import gr from gnuradio import blocks import SoapySDR from SoapySDR import * #SOAPY_SDR_ constants import osmosdr from osmosdr import * from gnuradio.filter import firdes def gen_sig_io(num_elements): # Dynamically create types for signature io = [] for i in range(num_elements): io.append(gr.sizeof_gr_complex*1) io.append(gr.sizeof_float*num_elements) return io class limesdr_soapysdr_source(gr.hier_block2): def __init__(self, samp_rate=1000000, center_freq=2400000000, gain=40, sources=2): gr.hier_block2.__init__( self, "LimeSDR SoapySDR", gr.io_signature(0, 0, 0), gr.io_signaturev(sources, sources, gen_sig_io(sources)), ) ################################################## # Parameters ################################################## self.samp_rate = samp_rate self.center_freq = center_freq self.gain = gain self.sources = sources args = dict(driver="lime") limesdr = SoapySDR.Device(args) # We need to detect the number of channels as the LimeSDR has two # and the LimeSDR-Mini has one chans = range(limesdr.getNumChannels(0)) if len(chans) < sources : raise Exception("limesdr device doesn't provide enough rx channels ") while len(chans) > sources : chans.pop() limesdr = None #warnning: args must be written like below args = 'soapy=0,driver=lime,nchan=' + str(sources) self.osmosdr_source_0 = osmosdr.source(args) self.osmosdr_source_0.set_clock_source('internal', 0) self.osmosdr_source_0.set_sample_rate(self.samp_rate) #self.osmosdr_source_0.set_time_now(osmosdr.time_spec_t()) for ch in chans: self.osmosdr_source_0.set_gain(self.gain, ch) # print(self.limesdr.listAntennas(SOAPY_SDR_RX, 0)) # ('NONE', 'LNAH', 'LNAL', 'LNAW', 'LB1', 'LB2') #RX_L : is lower then 2.5Ghz,RX_H : higher than 2.5GhZ self.osmosdr_source_0.set_antenna("LNAH", ch) #self.osmosdr_source_0.set_bandwidth(ch,20*1000*1000) self.osmosdr_source_0.set_dc_offset_mode(osmosdr.source_IQBalanceAutomatic,ch) # Use timed commands to set frequencies self.set_center_freq(center_freq,sources) ################################################## # Connections ################################################## for source in range(sources): self.connect((self.osmosdr_source_0, source), (self, source)) def __del__(self): self.disconnect_all() if hasattr(gr.hier_block2,"__del__") : gr.hier_block2.__del__(self) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.osmosdr_source_0.set_sample_rate(self.samp_rate) def set_center_freq(self, center_freq, sources): self.center_freq = center_freq for ch in range(self.sources): self.osmosdr_source_0.set_center_freq(self.center_freq, ch) def get_center_freq(self): return self.center_freq def get_gain(self): return self.gain def set_gain(self, gain): print "DO NOT TUNE GAINS DURING RUNTIME" def get_sources(self): return self.sources def set_sources(self, sources): print "DO NOT CHANGE SOURCES DURING RUNTIME" |
编译代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cd ~ $ cd gr-doa $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig |
测试代码
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 |
#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Run Rootmusic Lin Array LimeSDR # Generated: Tue Apr 3 20:14:45 2018 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" def struct(data): return type('Struct', (object,), data)() from PyQt4 import Qt from gnuradio import eng_notation from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from optparse import OptionParser import doa import sys class run_RootMUSIC_lin_array_LimeSDR(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Run Rootmusic Lin Array LimeSDR") Qt.QWidget.__init__(self) self.setWindowTitle("Run Rootmusic Lin Array LimeSDR") try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables # NormSpacing 天线之间的实际距离,单位为米,类型为浮点类型 # NumTargets 发出信号的设备数量 ################################################## self.input_variables = input_variables = struct({"SampleRate": 1000000, "CenterFreq": 2550000000, "Gain": 60, "NumArrayElements": 2, "NormSpacing": 0.5, "SnapshotSize": 2**11, "OverlapSize": 2**9, "NumTargets": 1, }) ################################################## # Blocks ################################################## self.limesdr = doa.limesdr_soapysdr_source( samp_rate=input_variables.SampleRate, center_freq=input_variables.CenterFreq, gain=input_variables.Gain, sources=input_variables.NumArrayElements ) self.tab = Qt.QTabWidget() self.tab_widget_0 = Qt.QWidget() self.tab_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.tab_widget_0) self.tab_grid_layout_0 = Qt.QGridLayout() self.tab_layout_0.addLayout(self.tab_grid_layout_0) self.tab.addTab(self.tab_widget_0, "Angle of Arrival") self.top_layout.addWidget(self.tab) self.doa_rootMUSIC_linear_array_0 = doa.rootMUSIC_linear_array(input_variables.NormSpacing, input_variables.NumTargets, input_variables.NumArrayElements) self.doa_qt_compass_0 = doa.compass("", 0, 180, 10, 0) self.top_layout.addLayout(self.doa_qt_compass_0.this_layout) self.doa_autocorrelate_0 = doa.autocorrelate(input_variables.NumArrayElements, input_variables.SnapshotSize, input_variables.OverlapSize, 1) ################################################## # Connections ################################################## self.connect((self.doa_autocorrelate_0, 0), (self.doa_rootMUSIC_linear_array_0, 0)) self.connect((self.doa_rootMUSIC_linear_array_0, 0), (self.doa_qt_compass_0, 0)) for ch in range(input_variables.NumArrayElements) : self.connect((self.limesdr, ch), (self.doa_autocorrelate_0, ch)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def main(top_block_cls=run_RootMUSIC_lin_array_LimeSDR, options=None): from distutils.version import StrictVersion if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): style = gr.prefs().get_string('qtgui', 'style', 'raster') Qt.QApplication.setGraphicsSystem(style) qapp = Qt.QApplication(sys.argv) tb = top_block_cls() tb.start() tb.show() def quitting(): tb.stop() tb.wait() qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) qapp.exec_() if __name__ == '__main__': main() |
如果上面的代码下载困难,可从本站下载一份代码拷贝
gr-doa,armadillo-code,SoapySDR源代码下载,gr-osmosdr
至于测试的信号发送设备,任何能产生自相关信号的设备都可以,一般建议对讲机即可,注意频率要调整到一致才可以。