- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想添加一些噪音
44100 Hz
2 channel
16 bit
interleaved PCM
#define SAMPLING_RATE 44100
int *noise_buffer;
void generate_440(int *buffer) {
int pos; // sample number we're on
float volume = 0.1; // 0 to 1.0, one being the loudest
for (pos = 0; pos < SAMPLING_RATE; pos++) {
float a = (2 * 3.14159) * pos / (SAMPLING_RATE / 440.0);
float v = sin(a) * volume;
// convert from [-1.0,1.0] to [-32768,32767]:
buffer[pos] = remap_level_to_signed_16_bit(v);
}
}
..
noise_buffer = (int *) malloc(SAMPLING_RATE * sizeof(int));
generate_440(noise_buffer);
int count = read(file_fd, buffer, len);
int bytesPerSample = 4;
int samples = count / bytesPerSample, c, currentSample;
for (currentSample = 0; currentSample < samples; currentSample++) {
samplesWritten++;
memcpy(buffer+(currentSample * bytesPerSample), noise_buffer+((samplesWritten%SAMPLING_RATE)), bytesPerSample);
}
buffer
中的原始 PCM带有(响亮的)440Hz 音调。
for (c = 0; c < bytesPerSample; c++) {
*(buffer+(currentSample * bytesPerSample) + c)=(*(buffer+(currentSample * bytesPerSample) + c)+*(noise_buffer+((samplesWritten%SAMPLING_RATE)) + c)) / 2;
}
最佳答案
这是我添加两个信号的方法:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define SAMPLING_RATE 44100
int remap_level_to_signed_16_bit(float v)
{
if (v >= 1)
return 32767;
if (v <= -1)
return -32767;
return v * 32767;
}
void generate_freq(int *buffer, size_t count, float volume, float freq)
{
size_t pos; // sample number we're on
for (pos = 0; pos < count; pos++) {
float a = 2 * 3.14159f * freq * pos / SAMPLING_RATE;
float v = sin(a) * volume;
// convert from [-1.0,1.0] to [-32767,32767]:
buffer[pos] = remap_level_to_signed_16_bit(v);
}
}
void generate_noise(int *buffer, size_t count, float volume)
{
size_t pos; // sample number we're on
for (pos = 0; pos < count; pos++) {
// random number [-1.0,1.0]
float v = (rand() - RAND_MAX / 2.0f) * 2 / RAND_MAX * volume;
// convert from [-1.0,1.0] to [-32767,32767]:
buffer[pos] = remap_level_to_signed_16_bit(v);
}
}
int add_two_16_bit_samples(int a, int b)
{
int sum;
// add a and b avoiding overflow
if (a >= 0 && b >= 0) {
if (a > INT_MAX - b) // mathematically equivalent to if (a + b > INT_MAX)
sum = INT_MAX; // limit sum at INT_MAX if overflow
else
sum = a + b;
} else if (a < 0 && b < 0) {
if (a < INT_MIN - b) // mathematically equivalent to if (a + b < INT_MIN)
sum = INT_MIN; // limit sum at INT_MIN if overflow
else
sum = a + b;
} else {
sum = a + b;
}
// limit sum to [-32767,32767]
if (sum > 32767)
sum = 32767;
if (sum < -32767)
sum = -32767;
return sum;
}
void add_16_bit_samples(int *destination, const int* source, size_t count)
{
for (; count--; destination++, source++) {
*destination = add_two_16_bit_samples(*destination, *source);
}
}
int save_16_bit_samples(const char* name, int* buf, size_t count, int stereo)
{
FILE* f = fopen(name, "wb");
int res = -1; // failure by default
if (f != NULL) {
while (count) {
// convert sample to 2's complement unsigned representation
unsigned v = *buf++;
// separate it into 8-bit parts
unsigned char c[2];
c[0] = v & 0xFF; // LSB
c[1] = (v >> 8) & 0xFF; // MSB
// save it as little endian
if (fwrite(c, 1, 2, f) != 2)
break;
// do once more if stereo
if (stereo)
if (fwrite(c, 1, 2, f) != 2)
break;
count--;
}
if (count == 0)
res = 0; // success if all samples written out
fclose(f);
}
return res;
}
int main(void)
{
int* buf_440 = malloc(SAMPLING_RATE * sizeof(int));
int* buf_noise = malloc(SAMPLING_RATE * sizeof(int));
if (buf_440 == NULL || buf_noise == NULL) {
printf("failed to allocate memory for samples\n");
return EXIT_FAILURE;
}
generate_freq(buf_440, SAMPLING_RATE, 0.1f/*volume*/, 440.0f/*freq*/);
generate_noise(buf_noise, SAMPLING_RATE, 0.01f/*volume*/);
add_16_bit_samples(buf_440, buf_noise, SAMPLING_RATE);
if (save_16_bit_samples("440noise.pcm", buf_440, SAMPLING_RATE, 1/*stereo*/)) {
printf("failed to save samples to file\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
关于c - 在 2ch PCM 上添加 440HZ 音调(合并 PCM,噪声叠加),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033718/
到目前为止,在我使用 MediaCodec 连接视频的过程中,我终于设法将 48k Hz 音频重新采样为 44.1k Hz。 我一直在测试将视频与两个视频连接在一起,第一个具有 22050 Hz 2
我现在正在尝试编译某人的代码,这个人正在使用变量 HZ(我认为它代表 Hertz,代表 CPU 的赫兹),但编译器提示变量未定义。我猜这个人没有包含正确的头文件。 那么有谁知道HZ是在哪个头文件中定义
在 sched_fair.c 中有: unsigned int sysctl_sched_latency = 5000000ULL //5m unsigned int sysctl_sched_min
我看过这个http://kaasxxx.wordpress.com/2008/01/22/linux-hz-checker/但是脚本似乎不起作用。无论如何知道在 Linux 的终端中检查“HZ”的简单
我正在从Google的文本到语音服务获取16位PCM数据(24000 Hz),然后将其存储在u8数组中。有没有一种简单的方法可以将其重采样到48000 Hz,而输出是u8阵列?我不了解FFmpeg上的
我正在尝试制作一个简单的振荡器程序,我可以在其中更改 Octave 类型,就像 Massive VST 用正数和负数显示它的方式一样: (来源:massivesynth.com) 现在,我知道一个 O
我收到一条消息,该消息从在 ARM 平台上运行的 Linux 应用程序 (Qt C++) 打印出来: Unknown HZ value! (108) Assume 100. 此输出会定期出现在不同
我正在 python 上的 pandas 中开发一个项目。我收到这样的 .csv 文件作为输入: Name Timestamp Data A1 259
我正在使用 Estimote SDK (3.6.0) 与我的信标进行通信。现在我在某处读到,可以获取 5 Hz 信标的广告包。这仅适用于 Estimote 信标还是也适用于其他供应商的信标?在源代码中
音频数据如何下采样到 5512 Hz PCM?我读过一些文章,涉及的步骤是将音频解码为 PCM,将其转换为单声道,然后对其进行下采样。 为了转换为单声道,是否对每帧的 channel 进行平均以获得单
我以大约 50 Hz 的频率(每 0.02 秒一次,正如 Android 所允许的那样...)收集加速度计数据 这是 10 秒数据窗口的幅度图,我想在其上估计功率谱密度: 像这样应用 scipy.si
我有一个传感器,它使用 RS422 通过串口发送消息。 (我认为这是正确的术语。)无论如何,我制作了线束,并将其连接到我的 rs422 到 usb 转换器和 tada,我在 super 终端中获得了数
我一直在使用the Android NDK Camera sample有了它,人们就可以使用 the yuvreader_ inside DrawFrame 读取格式为 AIMAGE_FORMAT_Y
有没有可以读取的全局变量?从 2.6 内核开始,它是可配置的,所以我不能确定是否确实使用了默认值。我正在使用“崩溃”来调试内核核心转储。 最佳答案 它是在编译期间在内核的 .config 中配置的。检
我有 形式的原始音频数据 vector m_shorts; 音频数据为 22050 kHz 单声道。 有人知道我如何(没有任何第三方库)快速将短 vector 转换为 48000 Hz 单声道吗? 我
如何通过ADB shell知道Android内核的HZ值? (没有任何编码) 我检查了How to check HZ in the terminal? ,但这不适用于 Android ADB shel
从 iOS 上的音频流(音乐)获取 Hz 频率值的最佳方法是什么? Apple 提供的最好和最简单的框架是什么?提前致谢。 最佳答案 这是我使用 Accelerate Framework 在 iOS
这就是我所拥有的。它生成 5 秒 Au file具有 440 Hz 正弦波,灵感来自 this question . -- file: tone.hs import qualified Data.By
我目前正在研究 WiFI 的内核源代码(net/mac80211) (三星Galaxy S3---GT-I9300---内核) 我已经看到了如下代码: /* * Scanning implement
我正在使用 ublox NEO-M8N-0-01全局导航卫星系统模块。该模块最高支持 5Hz GPS+GLONASS 和 10Hz GPS。 但是,当我尝试更改采样率(通过消息 View 中的 UBX
我是一名优秀的程序员,十分优秀!