小编ans*_*shu的帖子

在C中实现Goertzel算法

我正在DSP处理器上实现BFSK跳频通信系统.一些论坛成员建议使用Goertzel算法来解调特定频率的跳频.我已经尝试在C中实现goertzel算法.代码如下:

float goertzel(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data)
{
    int     k,i;
    float   floatnumSamples;
    float   omega,sine,cosine,coeff,q0,q1,q2,result,real,imag;

    floatnumSamples = (float) numSamples;
    k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
    omega = (2.0 * M_PI * k) / floatnumSamples;
    sine = sin(omega);
    cosine = cos(omega);
    coeff = 2.0 * cosine;
    q0=0;
    q1=0;
    q2=0;

    for(i=0; i<numSamples; i++)
    {
        q0 = coeff * q1 - q2 + data[i];
        q2 = q1;
        q1 = q0;
    }
    real = (q1 - q2 * cosine);
    imag …
Run Code Online (Sandbox Code Playgroud)

c embedded signal-processing goertzel-algorithm

13
推荐指数
1
解决办法
2万
查看次数

Linux上的C编程新手,坚持使用类型转换

我对Linux上的编程很新.我正在尝试在我的一个任务中实现一个消息队列.但我无法做到.代码如下:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <linux/sched.h>
#include <stdlib.h>
#include <string.h>

typedef long MSISDN;
typedef struct 
{
   long mtype;
   long mtext;
}msgbuf;

void init(int qid,int key) {
   qid = msgget(key,IPC_CREAT|0666);
}

void sendMsg(long t_ype, long buf, int len, int qid) {

   int length = sizeof(long) + sizeof(MSISDN);
   msgbuf *p = malloc(length);
   p->mtype = t_ype;
   fputc('2',stderr);
   void* tosend = (void*) buff;
   fputc('3',stderr);

   memcpy(p->mtext,tosend,length);

   fputc('4',stderr);
   msgsnd(qid,p,length,IPC_NOWAIT);
   free(p);
}



void main()
{
   int qid;
   int key = 1111;
   int len= sizeof(MSISDN); …
Run Code Online (Sandbox Code Playgroud)

c typecast-operator

5
推荐指数
1
解决办法
731
查看次数

将32位转换为浮点值

我正在研究DSP处理器,以便在Linux系统上使用C实现BFSK跳频机制.在程序的接收器部分,我得到一组样本的输入,我使用Goertzel算法解调,以确定接收的位是0还是1.

现在,我能够分别检测这些位.但我必须以float数组的形式返回数据进行处理.所以,我需要打包接收到的每一组32位来形成一个浮点值.对,我做的事情如下:

uint32_t i,j,curBit,curBlk;
unint32_t *outData; //this is intiallized to address of some pre-defined location in DSP memory
float *output;
for(i=0; i<num_os_bits; i++) //Loop for number of data bits
{ 

//Demodulate the data and set curBit=0x0000 or 0x8000

curBlk=curBlk>>1;
curBlk=curBlk|curBit;

bitsCounter+=1;
    if(i!=0 && (bitsCounter%32)==0) //32-bits processed, save the data in array
    {
        *(outData+j)=curBlk;
        j+=1;
        curBlk=0;
    }
}

output=(float *)outData;
Run Code Online (Sandbox Code Playgroud)

现在,output数组的值只是outData小数点后0 的数组值.例如:如果output[i]=12345`outData [i] = 12345.0000'.

但在测试程序时,我使用float数组生成位的样本测试数据 float data[] ={123.12456,45.789,297.0956};

因此在解调之后我期望浮点数组output具有与data数组相同的值.是否有其他方法可以将32位数据转换为浮点数.我应该将收到的位存储到char …

c linux embedded

5
推荐指数
2
解决办法
7821
查看次数

在Matlab中使用FFT进行频移

我正在通过跳频实现BFSK调制和解调,我需要使用Matlab测试我的结果。我从BFSK程序获得的输出是正弦值数组,对应于不同位的载波信号。这些信号是以2.51KHz为中心的通带信号,其周围为4KHz的带宽。但是要测试解调步骤,我需要将信号转换为基带。因此,我需要将输出信号的中心设为0Hz。

我知道,创建一个2.51KHz的复信号并将其在时域中相乘即可完成这项工作。但是我有什么方法可以fft()在Matlab中与函数一起使用来偏移信号的中心频率,然后取ifft()信号的一个来生成基带信号。

谢谢安淑

matlab fft frequency-analysis

5
推荐指数
1
解决办法
9872
查看次数

使用clock()来测量执行时间

我正在运行一个使用GCC和专有DSP交叉编译器的C程序来模拟一些功能.我使用以下代码来测量程序特定部分的执行时间:

clock_t start,end;
printf("DECODING DATA:\n");
start=clock();
conv3_dec(encoded, decoded,3*length,0);
end=clock();
duration = (double)(end - start) / CLOCKS_PER_SEC;
printf("DECODING TIME = %f\n",duration);
Run Code Online (Sandbox Code Playgroud)

这里conv3_dec()是我的程序定义的功能,我想找到这个函数的运行时间.

现在的问题是,当我的程序运行时,conv3_dec()函数运行了将近2个小时,但是输出结果printf("DECODING TIME = %f\n",duration)显示函数的执行仅在半秒钟内完成(DECODING TIME = 0.455443).这对我来说非常困惑.

我之前使用过该clock_t技术测量程序的运行时间,但差异从未如此之大.这是由交叉编译器引起的吗?正如旁注所示,模拟器模拟仅以500MHz运行的DSP处理器,因此DSP处理器和CPU的时钟速度差异导致错误正在测量CLOCKS_PER_SEC.

c simulator cross-compiling

5
推荐指数
2
解决办法
2万
查看次数

多线程导致C的性能降低

我在C中实现了一个实时信号处理算法,我试图使用多线程并行化一部分代码.

单线程实现的代码是

void calcTheta(float *theta, float **s, float ***q, float ***g,
               int *Ki, int m, int numObv, int numTask) {
    int i, j, k;

    for (i = 0; i < m; i++) {
        theta[i] = 0;
        for (j = 0; j < numObv; j++) {
            for (k = 0; k < numTask; k++) {
                theta[i] += (Ki[k] * (pow(fabs(q[i][j][k]), 2) / g[i][j][k]) - s[i][k]) /
                             (s[i][k] * (s[i][k] - (pow(fabs(q[i][j][k]), 2) / g[i][j][k])));
            }//k
        }//j
        theta[i] = (numTask * numObv) …
Run Code Online (Sandbox Code Playgroud)

c performance multithreading

2
推荐指数
1
解决办法
83
查看次数