chang某某 2019-12-08 14:28 采纳率: 0%
浏览 284

如何用zybo板(zynq-7010)上实现变声功能?

网上下了soundtouch库,根据这篇文章
https://www.cnblogs.com/CodeMIRACLE/p/5514806.html
用VS编译出的exe文件效果很好,但不知如何把C++代码直接扔进板子里,用了vivado hls,出现了如下错误,现怀疑大方向就是错的?望诸位指点一二

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../../../../../../Desktop/fa/src/test.cpp in debug mode
csim.mk:81: recipe for target 'obj/test.o' failed
../../../../../../../../Desktop/fa/src/test.cpp: In function 'void DelArray(void*)':
../../../../../../../../Desktop/fa/src/test.cpp:52:12: warning: deleting 'void*' is undefined [-Wdelete-incomplete]
delete []pData;
^~~~~
../../../../../../../../Desktop/fa/src/test.cpp: In function 'bool CombineWaveFile(int, char (*)[256], char*)':
../../../../../../../../Desktop/fa/src/test.cpp:76:48: error: cast from 'FILE* {aka _iobuf*}' to 'int' loses precision [-fpermissive]
(pFileHandle +i)= (int)(fopen(argv[i], "rb"));
^
../../../../../../../../Desktop/fa/src/test.cpp:90:83: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
int nRead = fread(pRiff_Header+i, 1, sizeof(RIFF_HEADER), (FILE
)(pFileHandle[i]));
^
../../../../../../../../Desktop/fa/src/test.cpp:101:61: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRead = fread(pFmt_Block+i, 1, 8, (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:112:101: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRead = fread(&((pFmt_Block+i)->wavFormat), 1, (pFmt_Block+i)->dwFmtSize, (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:123:62: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRead = fread(pFact_Block+i, 1, 8, (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:137:106: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRead = fread(&((pFact_Block+i)->dwData), 1, sizeof((pFact_Block+i)->dwData), (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:147:80: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRead = fread(pData_Block+i, 1, sizeof(DATA_BLOCK), (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:200:75: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
int nRet = fread(strTemp, 1, sizeof(strTemp)-1, (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:204:72: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
nRet = fread(strTemp, 1, sizeof(strTemp)-1, (FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp:206:34: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
fclose((FILE*)(*(pFileHandle+i)));
^
../../../../../../../../Desktop/fa/src/test.cpp: In function 'int main()':
../../../../../../../../Desktop/fa/src/test.cpp:226:39: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
CombineWaveFile(3, strFile, "out.wav");
^
make: *** [obj/test.o] Error 1
ERR: [SIM 100] 'csim_design' failed: compilation error(s).
INFO: [SIM 3] *************** CSIM finish ***************

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-28 23:18
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要使用Zynq-7010上的ZYBO板实现变声功能,您需要遵循以下步骤:

    1. 下载并安装必要的库和工具。这里包括soundtouch库、Vivado HLS以及Zynq-7010开发环境。

    2. 编写C/C++代码以在ZYBO板上运行SoundTouch库提供的声音处理函数。

    3. 将编写的代码与Zynq-7010硬件结合,使用Vivado HLS进行优化。

    4. 在目标板上构建和运行您的程序。

    5. 使用调试器检查和解决可能存在的问题。

    具体来说,您可以按照以下步骤编写C++代码来完成这个任务:

    首先,确保已经下载并安装了必要的库和工具:

    wget https://github.com/soundtouch/SoundTouch/releases/download/v1.2.0/SoundTouch-1.2.0.tar.gz
    tar -xzvf SoundTouch-1.2.0.tar.gz
    cd SoundTouch-1.2.0/
    ./configure --with-soundtouch-dir=/usr/local/soundtouch
    make
    sudo make install
    

    然后,创建一个名为main.cpp的新文件,并添加以下内容:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_WAVE_SIZE 4096 // Maximum wave size for processing
    
    // Function to read a file into memory
    FILE *read_file(const char *filename) {
        FILE *file;
        struct stat st;
        if ((file = fopen(filename, "r")) == NULL) {
            fprintf(stderr, "Failed to open file %s\n", filename);
            exit(EXIT_FAILURE);
        }
        if (fstat(fileno(file), &st) == -1) {
            fprintf(stderr, "Failed to get file statistics\n");
            exit(EXIT_FAILURE);
        }
        return file;
    }
    
    // Function to write data to a file
    void write_file(FILE *file, const void *data, size_t size) {
        fwrite(data, size, 1, file);
    }
    
    // Main function
    int main() {
        // Read input audio file
        FILE *input_file = read_file("input.wav");
        
        // Process audio file using SoundTouch API
        soundtouch::AudioInfo info;
        info.sample_rate = 44100; // Sample rate
        info.channels = 2; // Number of channels
        info.format = soundtouch::kInt16; // Format
        info.bit_depth = soundtouch::kBPS16; // Bit depth
        
        // Initialize SoundTouch library
        soundtouch::InitializeLibrary();
        
        // Call SoundTouch API to process audio
        soundtouch::ProcessAudio(info, input_file, output_file);
    
        // Write processed audio back to file
        write_file(output_file, data, sample_size);
    
        // Cleanup
        soundtouch::TerminateLibrary();
    
        return 0;
    }
    

    请注意,上述代码只是一个基本示例,实际应用中可能会有更多细节需要考虑,例如音频格式转换、数据大小限制等。此外,您还需要确保正确设置文件路径和参数,以便将输入文件读取到内存中,并正确调用SoundTouch API来进行音频处理。

    评论

报告相同问题?