C 正在从双指针复制到int数组。这是正确的吗?

C 正在从双指针复制到int数组。这是正确的吗?,c,C,我有一个双指针data->mono_通道,我想将所有的双精度转换成整数,并将它们放入一个数组中 int frames = data->audio_info_save->frames; short buffer[frames]; double* p; int i = 0; for (p = &(data->mono_channel)[0]; p < &(data->mono_channel)[frames]; p++) { buffer[i] =

我有一个双指针data->mono_通道,我想将所有的双精度转换成整数,并将它们放入一个数组中

int frames = data->audio_info_save->frames;
short buffer[frames];
double* p;
int i = 0;
for (p = &(data->mono_channel)[0]; p < &(data->mono_channel)[frames]; p++) {
  buffer[i] = (int) *p;
  i++;
}
所以我需要把我的双精度转换成整数


我没有听到任何声音。铸造是否正确?

样品可能需要从[-1,1]缩放到[min,max],其中min和max是整数样品的最小和最大整数值。

样品可能需要从[-1,1]缩放到[min,max],其中min和max是整数样本的最小和最大整数值。

如果
数据->单声道
是一个
的数组,则转换是正确的(尽管您的代码过于复杂——您应该只使用index
i
作为循环中的控制变量,并使用它来索引
double
s的输入数组以及由此产生的
int
s数组)


产生的静音可能是由于输入的
double
s不在正确的范围内(即,您可能需要一些缩放!)。如果打印出一些
double
s,您会看到什么?

如果
数据->单声道
是一个
double
s的数组,则转换是正确的(尽管您的代码过于复杂——您应该只使用index
i
作为循环中的控制变量,并使用它来索引
double
s的输入数组以及由此产生的
int
s数组)


导致静音的原因可能是输入的
double
s不在正确的范围内(即,您可能需要一些缩放!)。如果您打印出一些
double
s,您会看到什么?

看起来没问题,只需:

for (i = 0; i < frames; i++) {
  buffer[i] = (int)pdata->mono_channel[i];
}
(i=0;i{ 缓冲区[i]=(int)pdata->单声道[i]; }
数据是PCM编码的吗?这可能是您的问题。

看起来没问题,只需:

for (i = 0; i < frames; i++) {
  buffer[i] = (int)pdata->mono_channel[i];
}
(i=0;i{ 缓冲区[i]=(int)pdata->单声道[i]; }
数据PCM是否已编码?这可能是您的问题。

您的缓冲区类型为
short[]
。您是否已将ALSA PCM配置为期望16位值?请从ALSA项目中查看此信息。

您的缓冲区类型为
short[]
。您是否已将ALSA PCM配置为期望16位值?请从ALSA项目中了解这一点。

您可能必须缩放和剪裁输入值,剪裁可能非常慢,但有一个技巧。因此,如果您的输入在范围[-1,1]内,则可以使用以下代码:

double fclip( double value, double start, double end ) {
  return 0.5 * ( fabs(value-start) + (start+end) - fabs(value-end) );
}
...
for( i = 0; i < frames; i++ ) {
  buffer[i] = (short)fclip( 32767.0 * pdata->mono_channel[i], -32767, +32768 );
}
双fclip(双值、双起点、双终点){
返回0.5*(晶圆厂(价值起点)+(起点+终点)-晶圆厂(价值终点));
}
...
对于(i=0;i单声道[i],-32767,+32768);
}

您可能需要缩放和剪裁输入值,剪裁可能非常慢,但有一个技巧。因此,如果您的输入在[-1,1]范围内,则可以使用以下代码:

double fclip( double value, double start, double end ) {
  return 0.5 * ( fabs(value-start) + (start+end) - fabs(value-end) );
}
...
for( i = 0; i < frames; i++ ) {
  buffer[i] = (short)fclip( 32767.0 * pdata->mono_channel[i], -32767, +32768 );
}
双fclip(双值、双起点、双终点){
返回0.5*(晶圆厂(价值起点)+(起点+终点)-晶圆厂(价值终点));
}
...
对于(i=0;i单声道[i],-32767,+32768);
}

双精度值的范围是什么?请注意,如果双精度值介于0.000000和0.999999之间,则转换为
int
会将所有双精度值转换为
0
。如果只使用一个函数返回p的int值,这是否有效?即缓冲区[I]=double_to_int(*p)?我认为gcc正在优化您的意图。您的双精度值的范围是什么?请注意,如果它们介于,例如,0.000000和0.999999之间,则转换为
int
会将它们全部转换为
0
。如果您只使用一个函数返回int值p,这是否有效?即缓冲区[I]=double\u to\u int(*p)?我认为gcc正在优化你的意图。哇!太棒了。谢谢=)顺便说一句,我曾经在-这个网站上发现,这是一个很好的dsp相关代码段的源代码哇!太棒了。谢谢=)顺便说一句,我曾经在-这个网站上发现,这是一个非常酷的例子。现在我至少听到一些噪音了(谢谢你的帮助。我将在这个基础上构建,这是一个非常酷的例子。现在我至少听到一些噪音了(谢谢你的帮助。我将在此基础上构建。PCM编码意味着什么?数据来自libsndfile。这是否意味着它是PCM编码的?PCM编码意味着什么?数据来自libsndfile。这就是PCM编码吗?