我正在尝试在python中创建一个图形频谱分析器.
我目前正在读取1024字节的16位双通道44,100 Hz采样率音频流,并将两个通道的幅度平均在一起.所以现在我有256个签名短裤阵列.我现在想要使用像numpy这样的模块在该阵列上预先形成一个fft,然后使用结果创建图形频谱分析器,开始时只需32个小节.
我已经阅读了关于快速傅里叶变换和离散傅里叶变换的维基百科文章,但我仍然不清楚结果数组代表什么.这是我使用numpy在我的数组上执行fft后数组的样子:
[ -3.37260500e+05 +0.00000000e+00j 7.11787022e+05 +1.70667403e+04j
4.10040193e+05 +3.28653370e+05j 9.90933073e+04 +1.60555003e+05j
2.28787050e+05 +3.24141951e+05j 2.09781047e+04 +2.31063376e+05j
-2.15941453e+05 +1.63773851e+05j -7.07833051e+04 +1.52467334e+05j
-1.37440802e+05 +6.28107674e+04j -7.07536614e+03 +5.55634993e+03j
-4.31009964e+04 -1.74891657e+05j 1.39384348e+05 +1.95956947e+04j
1.73613033e+05 +1.16883207e+05j 1.15610357e+05 -2.62619884e+04j
-2.05469722e+05 +1.71343186e+05j -1.56779748e+04 +1.51258101e+05j
-2.08639913e+05 +6.07372799e+04j -2.90623668e+05 -2.79550838e+05j
-1.68112214e+05 +4.47877871e+04j -1.21289916e+03 +1.18397979e+05j
-1.55779104e+05 +5.06852464e+04j 1.95309737e+05 +1.93876325e+04j
-2.80400414e+05 +6.90079265e+04j 1.25892113e+04 -1.39293422e+05j
3.10709174e+04 -1.35248953e+05j 1.31003438e+05 +1.90799303e+05j...
Run Code Online (Sandbox Code Playgroud)
我想知道这些数字究竟代表什么,以及我如何将这些数字转换为32个柱中每一个的高度百分比.另外,我应该将2个频道平均在一起吗?
每个人似乎都说命名管道比插座IPC快.他们快多快了?我更喜欢使用套接字,因为它们可以进行双向通信并且非常灵活,但如果数量相当大,则会选择速度而不是灵活性.
我听说过Objective-C,但我自己从未使用过它.我很好奇每个人对它的看法是什么,也与C++有关.是否有任何类型的项目会更有用或更少用?
我正在为我正在进行的项目整理一个makefile.我在项目中有一个可执行文件和一个共享库.两者都使用一些相同的源文件,这些文件分别编译到目标文件中.为了能够在共享库中使用这些对象,我需要在gcc中使用-fPIC(位置无关代码)标志.使用可执行文件中使用的-fPIC编译对象是否有任何影响?
我的程序中有一个奇怪的错误,在我看来malloc()正在引起一个SIGSEGV,据我所知,这没有任何意义.我正在使用一个名为simclist的库来创建动态列表.
这是一个稍后引用的结构:
typedef struct {
int msgid;
int status;
void* udata;
list_t queue;
} msg_t;
Run Code Online (Sandbox Code Playgroud)
以下是代码:
msg_t* msg = (msg_t*) malloc( sizeof( msg_t ) );
msg->msgid = msgid;
msg->status = MSG_STAT_NEW;
msg->udata = udata;
list_init( &msg->queue );
Run Code Online (Sandbox Code Playgroud)
list_init 程序失败的地方,这里是list_init的代码:
/* list initialization */
int list_init(list_t *restrict l) {
if (l == NULL) return -1;
srandom((unsigned long)time(NULL));
l->numels = 0;
/* head/tail sentinels and mid pointer */
l->head_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
l->tail_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s));
l->head_sentinel->next = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 ipc 共享内存和信号量的程序。有一个主服务器进程创建共享内存和信号量。任意数量的客户端进程都可以连接到共享内存并在允许的情况下对其进行读写。信号量提供阻塞机制来控制读取和写入。一切正常,除了当我尝试终止客户端时。访问共享内存的信号量块位于线程中,并且在进程终止时我无法释放信号量块,以便线程正确退出。我该怎么办呢?这是针对 Linux 的。
具体来说,有1个shm和2个sem。第一个 sem 阻止写入,第二个 sem 阻止读取。当客户端有东西要写时,它会等待写入 sem 为 0,然后将其设置为 1,写入,然后将读取 sem 设置为 0,这会释放等待的服务器以读取客户端写入的内容。一旦读取,服务器将写入 sem 设置回 0,并且队列中的下一个客户端开始写入。它挂在一个 semop 调用上,该调用在读取 sem 为 0 时释放。这个 semop 调用位于一个线程中,我需要弄清楚如何在让主线程终止之前正确退出该线程。
这是我想做但不起作用的示例(睡眠假装是挂起的 semop 调用):
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void termination_handler (int signum) {
printf( "Got Signal\n" );
}
void *threadfunc( void *parm ) {
struct sigaction action;
action.sa_handler = termination_handler;
sigemptyset( &action.sa_mask );
action.sa_flags = 0;
sigaction( SIGUSR1, &action, NULL );
printf("Thread executing\n");
sleep( 100 …Run Code Online (Sandbox Code Playgroud) 我正在为不是xml的c寻找一个好的配置文件库.最好我真的很喜欢也有python绑定的人.我提出的最佳选择是在c和python中使用JSON库.您会推荐什么,或者您更喜欢读/写配置设置的方法是什么?
c ×3
ipc ×2
linux ×2
python ×2
audio ×1
c++ ×1
executable ×1
fft ×1
fpic ×1
gcc ×1
gdb ×1
malloc ×1
named-pipes ×1
objective-c ×1
performance ×1
pthreads ×1
semaphore ×1
sockets ×1
spectrum ×1