FIR滤波器设计:如何输入正弦波形

时间:2013-10-04 19:57:43

标签: c++ filter io

我目前正在上学,我必须用C / C ++编写FIR / IIR过滤器。

作为滤波器的输入,使用具有白噪声的2kHz正弦波。然后,通过将正弦波输入到C / C ++代码,我需要观察干净的正弦波输出。这一切都是在软件层面完成的。

我的问题是我不知道如何处理正弦波的输入/输出。例如,我不知道我可以使用或需要使用哪种类型的文件格式,我不知道如何制作正弦波形式等。

这可能是一个非常微不足道的问题,但我不知道从哪里开始。

有没有人对此类问题有任何经验或有任何提示?

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

生成2kHz的正弦波意味着您希望随着时间的推移生成值,当绘制图形时,遵循正弦波。选择幅度(你没有提到一个),并选择你的采样率。请参见此处的图表(http://en.wikipedia.org/wiki/Sine_wave);你想要的值是在绘制时遵循以2D绘制的正弦波,X轴为时间,Y轴是您正在测量的值的振幅。

  • 振幅(伏特,度,帕斯卡,毫安等)
  • 频率(2kHz,即2000正弦波/秒)
  • 采样率(您每秒需要多少个样本)

假设您生成的文件具有时间值和幅度测量值,您可能希望将其缩放到幅度(稍后会详细介绍)。因此,器件可能会提供8位或16位数字读数,表示针对某种规模的绝对或对数测量。

struct sample
{
    long usec; //microseconds (1/1,000,000 second)
    short value; //many devices give a value between 0 and 255
}

假设您每秒生成2000个样本。如果你实际测量的是外部值,那么每次都会得到相同的值(见图?),当绘制时看起来像一条直线。

所以你想要一个高于频率的采样率。假设您采样频率为2倍。然后你会在正弦波上看到180度的关闭,这可能是峰值,上升或下降的斜率,或正弦波过零的地方。频率4倍的采样率将显示锯齿图案。随着样本数量的增加,图形看起来更接近实际的正弦波。这类似于您在8位游戏精灵中看到的像素化。

您认为任何给定正弦波的样本数量会给您一个正弦波的近似值吗? 8? 16? 100? 500?假设您每秒采样1,000,000次,那么每个正弦波就会有1,000,000 / 2,000 = 500个样本。

  • 选择您的采样率(500)
  • 定义您的频率(2000)
  • 决定录制样本的时间(5秒?)
  • 定义您的振幅(设备测量0-255,但最大测量值是多少?)

以下是生成一些样本的代码,

#define MAXJITTER (10)
#define MAXNOISE  (20)
int
generate_samples( long duration, //duration in microseconds
         int amplitude,   //scaled peak measurement from device
         int frequency,   //Hz > 0
         int samplerate ) //how many samples/second > 0
{
    long ts; //timestamp in microseconds, usec
    long sdelay; //sample delay in usec
    if(frequency<1) frequency1=1; //avoid division by zero
    if(samplerate<1) samplerate=1; //avoid division by zero
    sdelay = 1000000/samplerate; //usec delay between each sample
    sample m;
    int jitter, noise; //introduce noise here

    for(  long ts=0; ts<duration;  ts+=sdelay ) // //in usec (microseconds)
    {
        //jitter, sample not exactly sdelay
        jitter = drand48()*MAXJITTER - (MAXJITTER/2); // +/-1/2 MAXJITTER
        //noise is mismeasurement
        noise = drand48()*MAXNOISE - (MAXNOISE/2);    // +/-1/2 MAXNOISE

        m.usec = ts + jitter;
        //2PI in a full sine wave
        float period = 2*PI * (ts*1.0/frequency);
        m.value = sin( period );
        //write m to file or save me to array/vector
    }
    return 0; //return number of samples, or sample array, etc
}

首先生成一些样本,

generate_samples( 5*1000000, 100, 2000, 2000*50 );

您可以将生成的样本绘制为噪声信号的视图。

以上肯定会回答您关于如何记录测量结果的许多问题,以及通常使用的格式。它显示了如何在多个正弦波周期内传输,生成具有抖动和噪声的随机样本,并在一段时间内记录样本。

构建过滤器是第二个问题。编写代码来模拟下面描述的过滤器会留下一个练习,或者第二个问题,因为你会收集到更多的理解,

生成的信号样本(上图)将被输入您编写的代码以构建过滤器。期望滤波器的输出可能是一组新的样本,可能带有抖动,但预计滤波器会消除至少一些噪声。然后,您就可以绘制过滤器生成的样本。

您可能会考虑将示例转换为逗号分隔文件,这样您就可以将它们加载到Excel中并对其进行图形化。如果你阐明了你的电子背景,你的知识,以及你对过滤器的了解程度等,它可能会有所帮助。

祝你好运!