为何用R

对于算法原型来讲,实际上MATLAB才是数字信号甚至包括CV数据处理的最好工具,不过MATLAB实在太厚重了,而且从正规使用来讲成本相当的高,公司大概是不会拨出这个预算的,个人更不可能了。考虑到一些邮件交互的时候还是要尽量避免版权问题,需要一个免费的数据处理和图形工具,所以R自然就是首选了。

实际上R的官方包一直都在本子里装着,只是平时大都拿来当计算器用(相当好用,秒算极限求导微分积分,用来辅导高中生简直神一般的存在)。不过R的命令行还是不方便做工程化的事情的,所以装了个人版RStudio,方便一边写函数脚本一边调试,还能像MATLAB一样随时看工作变量和图形。

对了,为什么不用Python,因为Python比MATLAB还厚重,哐哐的吃内存,实时绘图也慢一些。某种意义上Python还是更适合“计算”而不是“研究”。

数据说明

用的是一个3天线FMCW雷达的ADC信号,每个chirp采样128次。数据存储是二进制浮点格式:

ANT_0_float[128] | ANT_1_float[128] | ANT_2_float[128] | ...

即每一帧依次保存每个天线的128个浮点数。

数据可以从这里下载。

https://pan.baidu.com/s/1v3bEQQRT0TPK1uUKJzEOQQ?pwd=qkfk

R语言处理

语法建议去翻官方的Reference pdf链接,很全面。

读二进制文件

比较不方便的是数组没有那么灵活,不能直接写m[...] = ...,需要提前定义。不过考虑到效率问题实际上MATLAB也会疯狂提示你预先定义类型并预分配空间,只是R这里就变成强制了。

readframe <- function(filename){fid = file(filename, "rb")nrx = 3samples_per_chirp = 128frameno = 1m = array(dim=c(nrx,10000,samples_per_chirp))repeat{rx1 = readBin(fid, single(), n=samples_per_chirp)rx2 = readBin(fid, single(), n=samples_per_chirp)rx3 = readBin(fid, single(), n=samples_per_chirp)if(length(rx3)!=samples_per_chirp){break}m[1,frameno,] = rx1m[2,frameno,] = rx2m[3,frameno,] = rx3frameno = frameno+1}close(fid)cat("frameno ", frameno, "\n")m[,1:frameno,]
}

窗函数和FFT

基础包是没有窗函数的,不过自己写一个也无妨。


hann <- function(N){n = c(0:N-1)w = 0.5 - 0.5*cos(2*pi*n/(N-1))w
}fft_hann <- function(x){samples = length(x)w = hann(samples-1)xw = x*wy = fft(xw)y
}

所有数据做Range-FFT

这里用到R语言的神器apply来调用上边的带窗fft,这里要注意的是apply后的处理结果是保存在结果数组的第1维的。也就是说c(nRx, frames, samples)在apply处理之后会变成c(fft_N,nRx, frames)。

R的apply如此好用以至于我自己写的一个c++的BLAS库也实现了一个类似的调用,相当方便。你去翻一翻MATLAB的工具箱就会发现大量重复的代码在判断输入输出的数据维度和合法性,太low了。


rangefft <- function(m){dims = dim(m)nrx = dims[1]frames = dims[2]samples = dims[3]n = samplesiq = apply(m, MARGIN=c(1,2), fft_hann)iq
}

测试一下

我把上边的函数都写在radarfile.R,记得每次改完.R脚本,需要重新source一下,因为source(...)实际上不是“引用”而是“执行”。

> filename = 不给你们看
> source("radarfile.R")
> adc = readframe(filename)
> iq = rangefft(adc)
> iq_mean_rx = apply(iq, c(1,3), mean)
> dim(iq_mean_rx)
[1]  128 2751
> contour(abs(iq_mean_rx))

画出来是下边这样,这个是一个水流测算的雷达数据,因为ADC是实数信号,所以距离FFT做出来是对称的,实际只取一半。横坐标是距离,纵坐标是时间,还是可以看出来水流的发生和结束以及水面的变化。

没法像MATLAB或者matplotlib那样鼠标点击操作,只能通过命令行添加标记辅助线。 当然也可以安装扩展包来扩充绘图功能。

感想

挺方便高效的其实。R语言真的是一个很高效的工具,比如说你的表弟表妹拿着一个高三的压轴题问你做的对不对的时候,你说“行,我看看,你先去休息一下。”然后在命令行敲一个'R',两三下把规整的图形画出来,极值积分单调区间一目了然,然后你出去跟他说“这里不对,你再想想”,前后不到3分钟。

当然R能做的更多。

R语言的数字信号处理相关推荐

  1. 二值化处理c语言程序,数字信号处理c语言程序集

    目录 1.1均匀分布的随机数 第一章 数字信号的产生 1.2正态分布的随机数 1.3指数分布的随机数 1.4拉普拉斯(Laplace)分布的随机数 1.5瑞利(Rayleigh)分布的随机数 1.6对 ...

  2. R语言将数字类型转换为百分数

    val <- c(0.12,0.23,2.33) scales::percent(val, 0.01) [1] "12.00%" "23.00%" &qu ...

  3. [数字信号处理]单位冲击响应与频响以及FIR实现代码(C语言)

    1.单位冲击响应与频响 就如同之前所说的一样,使用下图所示的单位冲击响应,所设计的滤波器,是无法实现的. 现在,让我们看看其这个滤波器的频响.所谓频响,就是计算其单位冲击响应的离散时间傅里叶变换, 我 ...

  4. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字 目录

  5. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字、并为类型数据添加图像符号标签

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解.使用gtExtras包添加一个图,显示表中某一列中的数字.并为类型数据添加图像符号标签 目 ...

  6. R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间

    R语言sys方法:sys.info函数获取系统和用户信息.sys.localeConv函数获取当前区域中的数字和货币表示的详细信息.sys.setFileTime函数更改文件的时间 目录

  7. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gtExtras包添加一个图,显示表中某一列中的数字、并自定义表格数据显示的主题格式、并自定义数值数据的格式(例如百分比)

    R语言使用gt包和gtExtras包优雅地.漂亮地显示表格数据:使用gtExtras包添加一个图,显示表中某一列中的数字.并自定义表格数据显示的主题格式.并自定义数值数据的格式(例如百分比) 目录

  8. R语言ggplot2可视化更改轴上数字的格式(显示格式)实战

    R语言ggplot2可视化更改轴上数字的格式(显示格式)实战 目录 R语言ggplot2可视化更改轴上数字的格式(显示格式)实战

  9. r语言 新增一列数字类型_R语言实战之R语言基础语法精讲(一)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.在学习R数据科学之前,我们首先要对R语言的基础语法有一个良好的了 ...

最新文章

  1. 约瑟夫生死环游戏c语言程序,使用C++实现的约瑟夫生死游戏
  2. Android常用开源库之Universal-image-loader
  3. StoryBoard之User Defined Runtime Attributes的使用
  4. echat 图表动态数据生成,渲染,自定义Y轴坐标值
  5. JAVA循环与分支语句edu_Java分支结构和循环结构原理与用法详解
  6. python 爬虫难吗_python写爬虫难吗
  7. Centos 6.6 安装
  8. Git学代码之学会运行别人的代码
  9. 固高运动控制卡常规返回值
  10. jabber服务器搭建
  11. UNITY材质球合并
  12. 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
  13. java如何获取复选框选中的值
  14. 如何使用NVivo进行定性研究?
  15. python使用ffmpeg库高效免费完成音频格式转换
  16. 编程之美 笔记之——24点游戏
  17. centos7.4安装
  18. uni app 视频播放功能
  19. 免费的pdf转换器注册码
  20. 2.2 黑群晖驱动安装:Synology Photos人脸识别

热门文章

  1. BBB学习(七):Windows电脑通信调试(3):桌面
  2. PMP中必学的人际关系处理
  3. 计算机图形学概论论文5000字,《论文_计算机图形学论文李(定稿)》
  4. 装修需要注意的小细节
  5. 云计算解码(第2版)运营商观点第一书
  6. ORA-00942: table or view does not exist
  7. 生物化学复习III·糖类
  8. 雷神的微软平台安全宝典:使用源端口访问规则来限制访问
  9. 【交互设计】弹窗、新页面、当前页跳转
  10. 基于条纹投影的结构光3D成像的研究分享