将内存地址内容保存在C数组中
Saving memory address content in C Array
我正在为音频实现 C 代码延迟。
我有一个接收音频样本的内存地址。和另一个内存地址,指示新样本出现的位置。
我想做的是录制第一段音频(48000 个样本)。为此,我声明了一个用于保存音频样本的数组。
在主循环中,我将实际样本和延迟(1 秒前)样本相加,这与我想要实现的回声非常相似。
问题是我的代码重现了实际的声音,但不是延迟的,事实上,我每秒都能听到一点噪音,所以我猜它只读取数组的第一个样本,其余的是空。
我已经分析了我的代码,但我不知道我的错误在哪里。我觉得可能跟内存分配有关,但是我对C语言不是很熟悉。你能帮帮我吗?
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
/* REPLAY */
void main(){
short *buff[48000];
int i=0;
while(i<48000){
if((*(samp_rdy + 0x3)==0x1)){ //If there's a new sample
*buff[i]= *au_in;
i++;
*(samp_rdy + 0x3)=0x0;
}
}
while (1){
i=0;
while(i<48000){
if((*(samp_rdy + 0x3)==0x1)){
*au_out = *buff[i]+(*au_in); //Reproduces actual sample + delayed sample
*buff[i]=*au_in; //replaces the sample in the array for the new one
i++;
*(samp_rdy + 0x3)=0x0;
}
}
}
}
谢谢。
尝试使用 C99 模式 运行:
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
#define SAMPLE_BUF_SIZE (48000)
void main()
{
static short buff[SAMPLE_BUF_SIZE];
for(int i = 0; i < SAMPLE_BUF_SIZE; )
{
if(*(samp_rdy + 0x3)) //If there's a new sample
{
buff[i]= *au_in;
*(samp_rdy + 0x3)= 0;
i++;
}
}
while (1)
{
for(int i = 0; i < SAMPLE_BUF_SIZE; )
{
if(*(samp_rdy + 0x3)) //If there's a new sample
{
*au_out = buff[i] + (*au_in); //Reproduces actual sample + delayed sample
buff[i] = *au_in; //replaces the sample in the array for the new one
*(samp_rdy + 0x3)= 0;
i++;
}
}
}
}
我正在为音频实现 C 代码延迟。 我有一个接收音频样本的内存地址。和另一个内存地址,指示新样本出现的位置。
我想做的是录制第一段音频(48000 个样本)。为此,我声明了一个用于保存音频样本的数组。
在主循环中,我将实际样本和延迟(1 秒前)样本相加,这与我想要实现的回声非常相似。
问题是我的代码重现了实际的声音,但不是延迟的,事实上,我每秒都能听到一点噪音,所以我猜它只读取数组的第一个样本,其余的是空。
我已经分析了我的代码,但我不知道我的错误在哪里。我觉得可能跟内存分配有关,但是我对C语言不是很熟悉。你能帮帮我吗?
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
/* REPLAY */
void main(){
short *buff[48000];
int i=0;
while(i<48000){
if((*(samp_rdy + 0x3)==0x1)){ //If there's a new sample
*buff[i]= *au_in;
i++;
*(samp_rdy + 0x3)=0x0;
}
}
while (1){
i=0;
while(i<48000){
if((*(samp_rdy + 0x3)==0x1)){
*au_out = *buff[i]+(*au_in); //Reproduces actual sample + delayed sample
*buff[i]=*au_in; //replaces the sample in the array for the new one
i++;
*(samp_rdy + 0x3)=0x0;
}
}
}
}
谢谢。
尝试使用 C99 模式 运行:
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
#define SAMPLE_BUF_SIZE (48000)
void main()
{
static short buff[SAMPLE_BUF_SIZE];
for(int i = 0; i < SAMPLE_BUF_SIZE; )
{
if(*(samp_rdy + 0x3)) //If there's a new sample
{
buff[i]= *au_in;
*(samp_rdy + 0x3)= 0;
i++;
}
}
while (1)
{
for(int i = 0; i < SAMPLE_BUF_SIZE; )
{
if(*(samp_rdy + 0x3)) //If there's a new sample
{
*au_out = buff[i] + (*au_in); //Reproduces actual sample + delayed sample
buff[i] = *au_in; //replaces the sample in the array for the new one
*(samp_rdy + 0x3)= 0;
i++;
}
}
}
}