我几乎完成了我的开源DCF77解码器项目.当我注意到标准(Arduino)DCF77库在噪声信号上表现非常差时,一切都开始了.特别是当天线靠近电脑或我的洗衣机运行时,我从来没有能够从解码器中抽出时间.
我的第一种方法是为输入信号添加一个(数字)指数滤波器+触发器.
虽然这显着改善了情况,但仍然不是很好.然后我开始阅读一些关于数字信号处理的标准书籍,特别是Claude Elwood Shannon的原创作品.我的结论是,正确的方法是不对信号进行"解码",因为它是完全已知的先验(闰秒除外).相反,将接收的数据与本地合成的信号进行匹配并确定适当的相位会更合适.这反过来会将有效带宽减少一些数量级,从而显着降低噪声.
相位检测意味着需要快速卷积.有效卷积的标准方法当然是快速傅里叶变换.但是我正在为Arduino/Atmega 328实现.因此我只有2k RAM.因此,我开始堆叠匹配的锁相环滤波器,而不是使用FFT的直接方法.我在这里记录了不同的项目阶段:
我非常广泛地搜索了互联网,发现没有类似的方法.我仍然想知道是否有类似(也许更好)的实现.或者是否存在对这种信号重建的研究.
我不是在寻找:设计优化的代码以接近香农极限.我也没有在DCF77上搜索有关叠加PRNG代码的信息.我也不需要关于"匹配滤波器"的提示,因为我当前的实现是匹配滤波器的近似值.关于Viterbi Decoders或Trellis方法的具体提示不是我要寻找的 - 除非它们解决了严格的CPU和RAM限制问题.
我正在寻找的是:是否有任何其他非平凡算法的描述/实现,用于解码像DCF77这样的信号,在存在重大噪声的情况下CPU和RAM有限?也许在互联网时代以前的一些书籍或论文中?
我想知道为什么ECMA脚本不支持开箱即用的整数.当然我知道有一些整数(在这个问题的答案中有一个很好的总结:Javascript中的浮点数和整数之间的区别?).但这些仍然不是"真正的"整数.浮动作为整体的问题非常丰富.那么为什么它不支持整数,为什么这不能用ECMA脚本6修复?
我在我的应用程序中遇到了一些严重的内存泄漏,所以我设置了这个极其简单的解决方案来测试当String数组超出范围时会发生什么......
我知道String的旧TextString实现缺少析构函数,但是这个当前的实现似乎有它.
我正在使用这个MemoryFree库(请注意,此链接代码现已根据此问题的已接受答案进行修复).
该代码检查了两种情况:在两个不同的函数中分配char数组和字符串数组,以强制范围退出.
#include <MemoryFree.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
int freeBefore, freeAfter;
//TEST ALLOCATION OF CHAR ARRAY//
freeBefore = freeMemory();
AllocateCharArr();
freeAfter = freeMemory();
Serial.println("CHAR*: Before " + String(freeBefore)
+ ", After " + String(freeAfter)
+ ", Diff " + String(freeBefore - freeAfter));
//TEST ALLOCATION OF STRING//
freeBefore = freeMemory();
AllocateStringArr();
freeAfter = freeMemory();
Serial.println("STRING: Before " + String(freeBefore)
+ ", After " + String(freeAfter)
+ …
Run Code Online (Sandbox Code Playgroud) 如果我用Node.js执行以下代码
var Promise = require('bluebird');
Promise.join(
function A() { console.log("A"); },
function B() { console.log("B"); }
).done(
function done() { console.log("done");}
);
Run Code Online (Sandbox Code Playgroud)
控制台将记录
B
done
Run Code Online (Sandbox Code Playgroud)
不过我希望如此
A
B
done
Run Code Online (Sandbox Code Playgroud)
要么
B
A
done
Run Code Online (Sandbox Code Playgroud)
如果它在函数A中设置了断点,则永远不会达到.为什么它处理B但不处理A?
我写了一个循环分叉的程序.子进程执行的唯一操作是增加计数器并退出,而父进程等待它们中的每一个.
我的目标是分别测量父进程和所有子进程的用户和系统时间.我使用times()函数和struct tms成功完成了父进程.令人惊讶的是,对儿童过程的同样方法是行不通的.我在做什么错?如何衡量那些时间?
我也试过getrusage(),我/它失败了.
我的代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/times.h>
#include <time.h>
#ifndef COUNT
#define COUNT 100000
#endif
int counter;
int main(){
struct tms time1,time2;
times(&time1);
int count = COUNT;
pid_t pid;
while(count--){
if((pid=fork())<0){
printf("fork error\n");
} else if(pid==0){ /* child */
counter++;
_exit(0);
} else {
waitpid(pid,NULL,0); /*wait()*/
}
}
printf("COUNTER: %d\n",counter);
times(&time2);
long double clktck=sysconf(_SC_CLK_TCK);
double user=(time2.tms_utime-time1.tms_utime)/(double)clktck;
double system=(time2.tms_stime-time1.tms_stime)/(double)clktck;
double cuser=(time2.tms_cutime-time1.tms_cutime)/(double)clktck;
double csystem=(time2.tms_cstime-time1.tms_cstime)/(double)clktck;
printf("USER:%lf\nSYSTEM:%lf\n",user,system);
printf("CUSER:%lf\nCSYSTEM:%lf\n",cuser,csystem);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在和Arduino合作,我连接了伺服电机和普通电机.它们都工作但是当我启动正常的电机脚本时,伺服电机会产生小的痉挛物.任何人都可以帮我这个吗?
// Includes
#include <Servo.h>
// Aanmaken van de variabelen voor in de code
int ledPin = 13;
const int motorPin = 2;
int usbnumber = 0;
Servo stuurServo; // create servo object to control a servo
int pos = 90; // variable to store the servo position
// De eerste setup maken
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(motorPin, OUTPUT);
stuurServo.attach(12);
Serial.begin(9600);
stuurServo.write(pos);
}
void loop()
{
if (Serial.available() > 0) {
usbnumber = Serial.read();
}
if (usbnumber > 0) …
Run Code Online (Sandbox Code Playgroud) 如果我有类型的声明
typedef void (*command)();
template <command c>
void execute() {
c();
}
void task() { /* some piece of code */ }
Run Code Online (Sandbox Code Playgroud)
然后
execute<task>();
Run Code Online (Sandbox Code Playgroud)
将按预期编译和运行.但是,如果我将模板定义为
template <command c>
void execute() {
command();
}
Run Code Online (Sandbox Code Playgroud)
它仍然编译.我偶然做到了这一点.现在我对第二个版本应该做什么感到困惑.
如果我跑
dd if=/dev/zero bs=8192 count=1000000 | gzip --best >test.gz
Run Code Online (Sandbox Code Playgroud)
我得到一个7950131字节的输出文件.所以压缩比为~1/1000.但是我期望gzip使用行程编码+霍夫曼代码,因此至少会达到1/100000.为什么它不能为全零文件压缩更好?
我目前正在将我的DCF77 库(您可以在 GitHub 上找到源代码)从 Arduino(基于 AVR)移植到 Arduino Due(ARM Cortex M3)。我是 ARM 平台的绝对初学者。
使用基于 AVR 的 Arduino,我可以使用avr-libc来获取原子块。基本上,这会在阻止期间阻止所有中断,并在稍后再次允许中断。对于 AVR,这很好。现在对于 ARM Cortex 来说,事情开始变得复杂了。
首先:对于库的当前用途,这种方法也适用。所以我的第一个问题是:是否有类似于 ARM 的 avr-libc 的“ATOMIC”宏的东西?显然其他人已经想到了这个方向的东西。由于我使用的是 gcc,我可以增强这些宏,使其几乎与 avr-libv ATOMIC 宏一样工作。我已经找到了一些CMSIS 文档,但是这似乎只提供了“enable_irq”宏而不是“restore_irq”宏。
问题 1:是否有任何库(对于 gcc)已经这样做了?
因为 ARM 有不同的优先级中断,我也可以用不同的方式建立原子性。在我的情况下,“原子”块必须只确保它们不会被 systick 中断中断。所以实际上我不需要阻止一切来使我的块“足够原子”。进一步搜索我在开发人员信息中心找到了一篇ARM 同步原语文章。特别是有一个关于无锁编程的提示。根据这篇文章,这是一个先进的概念,并且有很多关于它的出版物。在网上搜索我只找到了这个概念的一般解释,例如这里。我认为无锁实现会非常酷,但此时我对 ARM 没有足够的信心从头开始实现它。
问题 2:有没有人对 ARM Cortex M3 上的内存块的无锁读取有一些提示?
正如我已经说过的,我只需要保护较低优先级的线程免受 sysTicks 的影响。所以另一个选择是暂时禁用 sysTicks。由于我正在实施时序敏感时钟算法,因此从长远来看,这不能降低整体 sysTick 频率。不过,引入一些小的抖动就可以了。这个时候我会觉得这个最有吸引力。
问题3:有什么好办法可以在不丢失tick的情况下阻塞sysTick中断?
我还找到了semaphores的CMSIS …
我想用电位计设定一个时间间隔.我想从1到6秒选择它.我怎样才能做到这一点?
到目前为止我有这个.如果我使用电位器,光线会从亮到暗.
(我正在使用Arduino Uno,我正在用C++编程).
const byte pot = 0;
int potWert=0;
potWert = analogRead(pot);
analogWrite(led,potWert/4);
Serial.println((byte)potWert); //just for output on the serial monitor
Run Code Online (Sandbox Code Playgroud) arduino ×4
c ×3
c++ ×2
javascript ×2
algorithm ×1
arduino-due ×1
arm ×1
bluebird ×1
compression ×1
dcf77 ×1
ecmascript-6 ×1
gcc ×1
gzip ×1
linux ×1
node.js ×1
promise ×1
templates ×1
time ×1