Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用musicg库在android中创建谱图_Java_Android_Audio - Fatal编程技术网

Java 使用musicg库在android中创建谱图

Java 使用musicg库在android中创建谱图,java,android,audio,Java,Android,Audio,我试图在Android中创建一个频谱图可视化。我使用android设备以.PCM格式录制声音,然后将其转换为.WAV,以便使用musicg库对其进行分析 使用musicg,我可以创建录制的.WAV的频谱图,并从该频谱图中提取双[]的频率-时间域数据 我下一步要解决的是如何在Android中可视化这些数据。任何帮助都将不胜感激 根据user3161880的回答,我尝试了以下方法,但我并没有在屏幕上看到任何东西。我可以画一个圆圈,如user3161880答案所示。你知道为什么这行不通吗 privat

我试图在Android中创建一个频谱图可视化。我使用android设备以.PCM格式录制声音,然后将其转换为.WAV,以便使用musicg库对其进行分析

使用musicg,我可以创建录制的.WAV的频谱图,并从该频谱图中提取双[]的频率-时间域数据

我下一步要解决的是如何在Android中可视化这些数据。任何帮助都将不胜感激

根据user3161880的回答,我尝试了以下方法,但我并没有在屏幕上看到任何东西。我可以画一个圆圈,如user3161880答案所示。你知道为什么这行不通吗

private static class SpectrogramView extends View {
        private Paint paint = new Paint();
        private double [][] data;

        public SpectrogramView(Context context, double [][] data) {
            super(context);
            this.data = data;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            if (data != null) {
                paint.setStrokeWidth(1);
                canvas.drawColor(Color.WHITE);
                int width = data.length;
                int height = data[0].length;
                for(int i = 0; i < width; i++) {
                    for(int j = 0; j < height; j++) {
                        int value;
                        value = 255 - (int)(data[i][j] * 255);
                        paint.setColor(value<<16|value<<8|value|255<<24);
                        canvas.drawPoint(i, height-1-j, paint);
                    }
                }

            } else {
                System.err.println("Data Corrupt");
            }

            //draw circle
            /*paint.setColor(Color.RED);
            canvas.drawColor(Color.BLUE);
            canvas.drawCircle(100.0f, 100.0f, 50.0f, paint);*/
        }
    }
私有静态类SpectrogramView扩展视图{
私人油漆=新油漆();
私人双[]数据;
公共SpectrogramView(上下文,双[]数据){
超级(上下文);
这个数据=数据;
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
如果(数据!=null){
油漆。设置行程宽度(1);
画布。drawColor(颜色。白色);
int width=data.length;
整数高度=数据[0]。长度;
对于(int i=0;ipaint.setColor(值如果您愿意显示预录音频的静态频谱图,一个简单的
视图
就足够了。您可以覆盖视图的
onDraw
方法。在这里,您可以访问将绘制背景的
画布

剩下的是您的显示逻辑,它将
double
映射到画布的颜色和时频网格到x-y坐标

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));
    }

    private static class MyView extends View {

        Paint paint = new Paint();

        public MyView(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            // draw circle
            paint.setColor(Color.RED);
            canvas.drawColor(Color.BLUE);
            canvas.drawCircle(100.f, 100.f, 50.f, paint);
        }

    }
}

一个比我原来的帖子更好的答案

private static class SpectrogramView extends View {
    private Paint paint = new Paint();
    private Bitmap bmp;

    public SpectrogramView(Context context, double [][] data) {
        super(context);

        if (data != null) {
            paint.setStrokeWidth(1);
            int width = data.length;
            int height = data[0].length;

        int[] arrayCol = new int[width*height];
        int counter = 0;
        for(int i = 0; i < height; i++) {
            for(int j = 0; j < width; j++) {
                int value;
                int color;
                value = 255 - (int)(data[j][i] * 255);
                color = (value<<16|value<<8|value|255<<24);
                arrayCol[counter] = color;
                counter ++;
            }
        }
        bmp = Bitmap.createBitmap(arrayCol, width, height, Config.ARGB_8888);

        } else {
            System.err.println("Data Corrupt");
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawBitmap(bmp, 0, 100, paint);
    }
}
私有静态类SpectrogramView扩展视图{
私人油漆=新油漆();
私有位图bmp;
公共SpectrogramView(上下文,双[]数据){
超级(上下文);
如果(数据!=null){
油漆。设置行程宽度(1);
int width=data.length;
整数高度=数据[0]。长度;
int[]arrayCol=新int[宽度*高度];
int计数器=0;
对于(int i=0;i