c - alsa linux c程序输出的奇怪正弦波

标签 c trigonometry alsa

我正在 ubuntu 上学习 alsa 编程。

我正在尝试将正弦波输出到笔记本电脑声卡的线路输出,然后通过音频线重定向到线路输入(麦克风)。

  ___LINE_IN(microphone)\
 /                       \
|                         \ _____________
|                          |soundcard-pc |
cable                     /
|                        /
 \ ___LINE_OUT(speakers)/

我正在使用这个代码

#include<stdio.h>
#include<stdlib.h>
#include<alsa/asoundlib.h>
#include<math.h>

#define SIZEBUF 2048

int main(void)
{
    int i;
    int err;
    double x;
    double cost;
    double frequency=500;
    unsigned int rate=44100;
    short buf[SIZEBUF];
    snd_pcm_t *phandle;
    snd_pcm_hw_params_t *hw_params;

    snd_pcm_open(&phandle, "default", SND_PCM_STREAM_PLAYBACK, 0);
    snd_pcm_hw_params_malloc(&hw_params);
    snd_pcm_hw_params_any(phandle, hw_params);

    if ((err = snd_pcm_hw_params_set_access(phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
        printf("Cannot set access type.\n");
        exit(1);
    }
    snd_pcm_hw_params_set_format(phandle, hw_params, SND_PCM_FORMAT_S16_LE);
    snd_pcm_hw_params_set_rate_near(phandle, hw_params, &rate, 0);
    snd_pcm_hw_params_set_channels(phandle, hw_params, 1);
    snd_pcm_hw_params(phandle, hw_params);
    snd_pcm_hw_params_free(hw_params);
    snd_pcm_prepare(phandle);

    cost = 2.0 * M_PI * frequency / (double)rate;

    printf("cost=%f.\n", cost);
    for (i = 1 ; i < SIZEBUF ; i++) {
        x      = sin(i * cost);
        buf[i] = (short)(32767 * x + 32768);
    }

    for (i = 0 ; i < 50 ; i++) {
        snd_pcm_writei(phandle, buf, SIZEBUF);
    }
    snd_pcm_close(phandle);

    exit(0);
}

我正在使用 audacity 来查看波浪,但它看起来很奇怪,就像这张图片一样

enter image description here

它似乎没有正弦波的行为。 为什么?

最佳答案

您正在使用 short 类型的示例,并且已将它们正确声明为 S16_LE。 但是,您的代码随后会计算这些值,就好像它们是无符号的一样:

buf[i] = (short)(32767 * x + 32768);

你不需要偏移量;对于带符号的样本,零实际上是零。使用这个:

buf[i] = (short)(32767 * x);

关于c - alsa linux c程序输出的奇怪正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521857/

相关文章:

vb.net - VB.net中余弦定律的优化

java - 如何使用文档的 tf*idf 分数实现余弦相似度?

audio - TravisCI 没有音频设备

linux - Linux 上 Matlab 中的 24 位声音捕获

linux - ALSA 与 PulseAudio - 延迟问题

c - RFC 3174 (SHA-1) 中指定的十六进制数的含义

c - += 是什么意思?

c - 如何使用 realloc() 函数逐项读取文件文本数组?

php - 使用 proc_open 运行进程

c - 如何在C中找到二维等边三角形的坐标?