在C中,我使用Libsndfile库来帮助我读取wav文件的值,以便我可以在之后对它们进行一些计算。虽然,当我得到文件的输出时,我不确定这些数字是什么意思。为什么这些数字是数百万?起初我以为它是赫兹,但它在我的脑海里没有意义。有关wav文件的信息可以在下面看到。在此之下,我使用函数sf_read_int()将值写入内存。
sf_read_int()做什么?这是从libsndfile的api文档中获得的:
我决定在图表上绘制一些这些巨大的值,它看起来非常类似于wav文件的样子(如果我导入到audacity并放大特定位置,我会看到这个)。请注意,显示的值与图表上的值不同,我在随机时间点对值进行采样。 所以我想真正的问题是,为什么这些价值如此之大(以百万计)?它们代表什么? (它们是字节吗?)
答案 0 :(得分:3)
limits.h
中你可以找到两个这样的定义(其中包括):
#define INT_MAX 0x7FFFFFFF
#define INT_MIN 0x80000000
,对应于-2147483648和2147483647之间的小数范围。
Libsndfile手册说:
sf_count_t sf_read_int(SNDFILE *sndfile, int *ptr, sf_count_t items);
即,将声音文件内容读入int *ptr
指向的整数值。 INT_MIN
和INT_MAX
之间的任何值都是合法值。在libsndfile API
中,调用程序使用的数据类型和文件的数据格式不需要相同。
请注意,没有"频率"在声音文件中。线性PCM文件仅包含以标题开头的原始样本数据,而"频率"是一种数学抽象或分析结果。
这可能是您感兴趣的:
在不同大小的整数PCM格式之间进行转换时(例如,使用sf_read_int()读取16位PCM编码的WAV文件)libsndfile遵循一个简单的规则:
每当整数数据从一个大小的容器移动到另一个大小的容器时,源容器中最重要的位将成为目标容器中最重要的位。
请务必仔细阅读本手册,尤其是清楚写明时。