- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个代码,据说应该读取一个音频文件作为输入,以便编写一个包含每个样本的 csv 文件。这是代码:
FILE *pipein;
pipein = popen("ffmpeg -i test1.wav -f s16le -ac 1 -", "r");
fread(buf, 2, sample_number, pipein);
pclose(pipein);
// Print the sample values in the buffer to a CSV file
FILE *csvfile;
csvfile = fopen("samples.csv", "w");
while (n<=sample_number) {
//if (buf[n]!=0) {
fprintf(csvfile, "%d %f\n", buf[cont], Sam_freq*cont);
cont++;
// }
n++;
}
fclose(csvfile);
这是运行代码后 csv 文件的样子:
10 43.150544
-36 43.150567
11 43.150590
30 43.150612
-29 43.150635
61 43.150658
13 43.150680
46 43.150703
121 43.150726
61 43.150748
144 43.150771
128 43.150794
130 43.150816
131 43.150839
我尝试使用 gnuplot 绘制 samples.csv 的数据,但我不明白 y 轴上表示哪个物理维度。
最佳答案
问题:
这不是 CSV 文件,它只是一个文本文件。
您的代码看起来不像那样。它远非可编译的,你在将“相关部分”复制到这个问题时犯了错误。
特别是,您使用 n
作为循环变量,但在访问缓冲区时使用 cont
。如果您的代码确实如此,您只会在输出中看到一对重复的值。
您没有定义采样率。
考虑以下反例:
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
#include <string.h>
#include <endian.h>
#include <stdio.h>
#ifndef SAMPLE_RATE
#define SAMPLE_RATE 48000
#endif
#define NO_SAMPLE INT_MIN
#if (__BYTE_ORDER-0 == __BIG_ENDIAN-0)
/* Use big-endian samples */
#define SAMPLE_FORMAT "s16be"
static inline int read_sample(FILE *source)
{
int16_t sample;
if (fread(&sample, sizeof sample, 1, source) == 1)
return (int)sample;
else
return NO_SAMPLE;
}
#elif (__BYTE_ORDER-0 == __LITTLE_ENDIAN-0) || (__BYTE_ORDER-0 == __PDP_ENDIAN-0)
/* Use little-endian samples */
#define SAMPLE_FORMAT "s16le"
static inline int read_sample(FILE *source)
{
int16_t sample;
if (fread(&sample, sizeof sample, 1, source) == 1)
return (int)sample;
else
return NO_SAMPLE;
}
#else
/* Use little-endian (two's complement) samples, but
read them byte-by-byte. */
#define SAMPLE_FORMAT "s16le"
static inline int16_t read_sample(FILE *source)
{
unsigned char bytes[2];
int sample;
if (fread(bytes, 2, 1, source) != 2)
return NO_SAMPLE;
sample = bytes[0] + 256*bytes[1];
if (sample > 32767)
return sample - 65536;
else
return sample;
}
#endif
int main(void)
{
const double sample_rate = SAMPLE_RATE;
FILE *in;
unsigned long i;
int sample;
in = popen("ffmpeg -i test1.wav -v -8 -nostats -f " SAMPLE_FORMAT " -ac 1 -", "r");
if (!in)
return EXIT_FAILURE;
i = 0u;
while ((sample = read_sample(in)) != NO_SAMPLE) {
printf("%.6f %9.6f\n", (double)i / sample_rate, (double)sample / 32768.0);
i++;
}
pclose(in);
return EXIT_SUCCESS;
}
它假设采样率是每秒 48,000 个样本(你可以使用 ffmpeg
先找出采样率),然后打印出每个样本,每行一个样本,时间在第一行列,以及第二列中的样本值(-1.0 到 +1.0 以下)。
在物理意义上,第一列反射(reflect)了样本的时间维度,第二列反射(reflect)了传感器中那一刻的相对压力变化——然而,压力变化的符号和线性度都不是真正已知的当然可以,因为这取决于所使用的确切麦克风、放大器和 ADC。
假设您编译并运行上面的代码,将输出重定向到 test1.out
:
gcc -Wall -O2 example.c -o example
./example > test1.out
您可以在 Gnuplot 中轻松绘制它。启动gnuplot
,并告诉它
set xlabel "Time [seconds]"
set ylabel "Relative pressure change [f((P-P0)/Pmax)]"
plot "test1.out" u 1:2 notitle w lines
对于纵轴,P
是横轴所指示时刻的压力,P0
是环境压力,Pmax
是麦克风可以检测到的最大压力变化,f()
是麦克风、麦克风放大器和所用模数转换器电路的非线性度的倒数。 (f()
和 Pmax
也可能取决于环境压力 P0
。)
关于c - gnuplot - 轴上的物理尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45595274/
我有以下类型的文件: ... 我想从 (x,y) 值绘制一个散点图,在不同数据集中的第一列中有不同的字符串,这些字符串将用不同的颜色绘制(我有许多不同的 x,y 值但只有几个不同的字符串)
有谁知道我如何在 GNU Plot 的条形图顶部放置一组值的折线图?我的条形图工作得很好,但我不知道如何在不同的列上添加折线图。 我100%迷路了!我可以很容易地用 excel 做到这一点,但它看起来
我在 x_i 点有数据点 f(x_i)(函数 f 未知,只有数值),f(0) = 0。数据显示小 x 处的峰状结构,随后是较大 x 处的缓慢肩部衰减设置在最大值的一半。我想通过这些数据点绘制平滑线。
更新:此问题已在较新版本 (>5.0) 的 gnuplot 中解决;请参阅@andyras 的回答。 我很难让 gnuplot 在非 postscript 终端中创建带有粗体和增强文本的标签。下面的脚
你好有没有办法完全重置gnuplot,即在中使用gnuplot同 状态为刚刚启动后? Reset 不会终止变量或函数, undefine 不能用作“undefine *”,因为第一个字符必须是字母。
我想用彩色背景和图案填充条形图。在Gnuplot中有可能吗? 我正在使用Gnuplot 4.6.5 我现在拥有的代码: # set terminal pngcairo transparent enh
我想用 gnuplot 做一个条形图。 我使用了这个设置 set style data boxes set style fill solid plot 'foo.dat' using 1:2:(1)
在 gnuplot 中,给定 f 和 g 两个从平面到实线的函数,我将在 g 获得正值时绘制 f。我有这个代码: set xrange [-2:2] set yrange [-2:2] set iso
只是想习惯 gnuplot。我在这个网站上搜索了几页寻找答案,阅读了文档(4.6),但仍然没有找到答案。说我有一个这样的数据文件: 0.0 0 1.0 25 2.0 55 3.0 110 4.0 45
我刚开始使用 gnuplot,我已经关注了 this question它根据我的需要绘制数据。但是,我非常想也包括错误栏。我尝试通过添加最小和最大错误列来做到这一点,如下所示: Broswer,Vid
我有一个包含30列和N行的数据文件。每行对应于x = {1,...,30}的函数f(x)的30个值。数据文件具有以下模式: # f(1) f(2) ... f(30) 1 7.221 5.302 ..
我正在绘制一些具有不同X范围的数据,我想根据当前X范围内数据的最大值和最小值更改yrange。当我使用GPVAL_Y_MAX和GPVAL_Y_MIN时,这些值对应于整个数据的最大值和最小值,而不仅仅是
我尝试搜索,但是找不到针对此特定条件的解决方案。在我的情节中,我正在比较两条痕迹。我正在使用折线图,并且两条迹线都以不同的颜色绘制。 plot "delay_try1.dat" using 1:2 t
我有一个非常简单的数据集: Critical 2 High 18 Medium 5 Low 14 根据该数据集在 gnuplot 中创建条形图很容易,但所有条形图的颜色都相同。我希望将 Critica
我正在使用 gnuplot 创建两个相邻的图。我想给整个事情一个标题,但如果我使用标准的 set title "blah" 命令,我会得到两个标题 - 每个图一个。我怎样才能只获得一个标题(位于图上方
我正在尝试在 gnuplot 中绘制水平直方图。 这是我当前的垂直(通常类型)直方图: width=0.5 hist(x,width)=width*floor(x/width)+width/2.0 s
我想在 gnuplot 中绘制多个有界函数。 IE。绘制从 0 到 2 的 x 和从 1 到 3 的 x^2 并将它们一起显示。 如何绘制具有不同界限的函数? 我知道如何执行分段函数,例如 (x <
例如,给定以下数据文件(本例中为 x^2): 0 1 4 9 16 25 gnuplot 可以绘制点以及点之间的差异,就像这样: 0 0 1 1 # ( 1 - 0 = 1) 4 3 # (
我正在尝试尝试一些简单的回归线作为 gnuplot 图的基础。然而,无论我做什么,我都无法在图表上得到多于一条的拟合线。这可能吗?这是我的(当前)gnuplot 程序...... set title
有什么方法可以迭代地从多个文件中检索数据并将它们绘制在 gnuplot 中的同一个图表上。假设我有像data1.txt,data2.txt......data1000.txt这样的文件;每个都有相同数
我是一名优秀的程序员,十分优秀!