首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FIR滤波器设计:如何输入正弦波波形

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

Stack Overflow用户
提问于 2013-10-04 19:57:43
回答 1查看 1.5K关注 0票数 1

我现在在学校上课,我必须用C/C++编写FIR/IIR滤波器。

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

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

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

有没有人在这类问题上有经验或有任何建议?

任何帮助都会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-05 05:05:47

在2 2kHz处产生正弦波意味着你想要产生随时间变化的值,当作图时,跟随正弦波。选择一个振幅(你没有提到一个),并选择你的抽样率。请看这里的图(wave);您想要的值在绘制时遵循在2D中绘制的正弦波,其中X轴是时间,Y轴是所测量值的振幅。

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

假设您生成一个具有时间值和幅度测量的文件,您希望将其缩放到您的振幅(稍后将详细介绍)。因此,设备可能会给出一个8位或16位的数字读数,它表示相对于某个比例的绝对或对数测量。

代码语言:javascript
复制
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,但测量的最大值是多少?)

下面是生成一些示例的代码,

代码语言:javascript
复制
#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
}

首先生成一些样本,

代码语言:javascript
复制
generate_samples( 5*1000000, 100, 2000, 2000*50 );

你可以把产生的样本绘制成噪声信号的视图。

上面的内容肯定回答了许多关于如何记录度量以及通常使用什么格式的问题。并给出了如何在多个正弦波周期中转,产生带有抖动和噪声的随机样本,并在一定时间内记录样本。

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

  • response
  • response

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

您可能会认为,将示例转换为逗号分隔的文件将使您能够将它们加载到excel中并绘制它们。如果你能阐明你的电子学背景,你的三角知识,以及你对过滤器的了解,也许会有帮助。

祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19189704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档