全部 -
我试图使用SciPy的signal.lfilter函数来过滤样本矢量 - 不幸的是,所有返回的都是NaN的矢量.
我绘制了滤波器的频率响应,滤波器系数看起来正确; 我很确定这个问题与实际调用有关lfilter.
这是一个高通的Chebychev I过滤器,我正在创建:
b,a = signal.iirdesign(wp = 0.11, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1')
Run Code Online (Sandbox Code Playgroud)
然后我用以下方法过滤数据:
filtered_data = signal.lfilter(b, a, data)
Run Code Online (Sandbox Code Playgroud)
下面,我正在从预过滤数据中打印20个样本,然后是过滤后的数据.您可以清楚地看到问题:
### Printing a small selection of the data before it is filtered:
((-0.003070347011089325+0.0073614344000816345j), (-0.003162827342748642+0.007342938333749771j), (-0.003310795873403549+0.0073614344000816345j), (-0.0031813234090805054+0.007342938333749771j), (-0.003255307674407959+0.007398426532745361j), (-0.003162827342748642+0.007287450134754181j), (-0.003125835210084915+0.007509402930736542j), (-0.003162827342748642+0.007342938333749771j), (-0.0031073391437530518+0.007287450134754181j), (-0.0032368116080760956+0.007398426532745361j), (-0.0030888430774211884+0.007342938333749771j))
### Printing a small selection of the filtered data:
[ nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj …Run Code Online (Sandbox Code Playgroud) 我正在使用pthreads编写一个多线程演示程序,其中一个线程将数据加载到STL队列,另一个线程从中读取.听起来很琐碎,对吗?不幸的是,推入队列的数据正在消失.我不是多线程的新手,也不熟悉内存结构 - 然而,这让我很难过.
这些是我对队列本身的声明以及保护它的互斥锁,它们位于客户端代码包含的标头中:
static std::queue<int32_t> messageQueue;
static pthread_mutex_t messageQueueLock;
Run Code Online (Sandbox Code Playgroud)
程序启动时,它会使用进程共享属性初始化互斥锁:
pthread_mutexattr_t sharedAttr;
pthread_mutexattr_init(&sharedAttr);
pthread_mutexattr_setpshared(&sharedAttr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&messageQueueLock, &sharedAttr);
Run Code Online (Sandbox Code Playgroud)
然后它启动'生产者'线程和'消费者'线程,并让他们做他们的事情.生产者线程将新项目推送到队列,然后进入休眠状态.以下是向队列添加内容的行:
pthread_mutex_lock(&messageQueueLock);
messageQueue.push(message);
pthread_mutex_unlock(&messageQueueLock);
Run Code Online (Sandbox Code Playgroud)
然后它休眠并让消费者线程接管.但是,当使用者线程检查队列中的项目时,队列是神奇的空.
我已经使用gdb介绍了该程序.以下是我跑步的输出.您可以看到生产者向队列添加内容的位置,我打印队列的大小以确保它在那里,有一个上下文切换到消费者线程,我再次打印队列的大小,它是空的.看看这个:
(gdb) b main_ex.cpp:70
Breakpoint 1 at 0x100006a24: file main_ex.cpp, line 70.
(gdb) run
Starting program: a.out
Reading symbols for shared libraries ++. done
Creating the mutex.
Producer thread starting up.
PRODUCER: Creating a message to send.
PRODUCER: Adding the message to the queue.
[Switching to process 7432]
Breakpoint 1, yourProcess () at main_ex.cpp:70
70 pthread_mutex_lock(&messageQueueLock);
(gdb) …Run Code Online (Sandbox Code Playgroud)