[Speex-dev] 【SPEEX】 use speex resample make noise
Jean-Marc Valin
jmvalin at jmvalin.ca
Wed Nov 6 07:12:58 UTC 2019
Look, how about you start from the testresample.c file? Oh, and you seem
to be reading 320 samples at a time and processing 640, so that can't be
good (and even beyond that your code is wrong for other reasons).
Jean-Marc
On 11/6/19 1:56 AM, zhouyuchen at iauto.com wrote:
> Hello,
> I printed the log, in/out len is not truncated, which means that the
> input and output are not truncated,
> but the sound quality is very bad, what would be the cause?
> I tried to call speex_resampler_reset_mem before each sample, but the
> effect is not as good as usual.
>
> int main()
> {
> int err;
> SpeexResamplerState *speex_resampler;
> speex_resampler = speex_resampler_init(1, 16000, 48000, 10, &err);
> FILE *fp = fopen("/data/zhou.wav", "rb+");
> FILE *fp2 = fopen("/data/zhou2.wav", "ab+");
> spx_int16_t inbuff[640] = {0};
> spx_int16_t outbuff[1920] = {0};
> spx_uint32_t inlen = 640;
> spx_uint32_t outlen = 1920;
> while (1)
> {
> speex_resampler_reset_mem(speex_resampler);
> int len = fread(inbuff, 2, 320, fp);
> if (len <= 0)
> {
> break;
> }
> int ret = speex_resampler_process_int(speex_resampler,
> 0,
> inbuff,
> &inlen,
> outbuff,
> &outlen);
> printf("ret is %d\n", ret);
> printf("inlen is %d\n",inlen);
> printf("outlen is %d\n",outlen);
> fwrite(outbuff, 1, outlen, fp2);
> }
> fflush(fp2);
> fclose(fp2);
> speex_resampler_destroy(speex_resampler);
> return 0;
> }
>
>
> ------------------------------------------------------------------------
> 以上
> 如有问题,请联系我
> mail zhouyuchen at iauto.com <mailto:zhouyuchen at iauto.com>
> tel 1905
>
> *发件人:* Jean-Marc Valin <mailto:jmvalin at jmvalin.ca>
> *发送时间:* 2019-11-06 01:20
> *收件人:* zhouyuchen at iauto.com <mailto:zhouyuchen at iauto.com>;
> speex-dev <mailto:speex-dev at xiph.org>
> *抄送:* jean-marc.valin <mailto:jean-marc.valin at usherbrooke.ca>
> *主题:* Re: 【SPEEX】 use speex resample make noise
> Be aware that inlen is an in/out parameter. It tells you how many
> samples the resampler read. That number can be smaller than what you
> passed -- in which case it means you need to buffer them and give them
> to the resampler again in the next call.
> Jean-Marc
> On 11/5/19 8:27 AM, zhouyuchen at iauto.com wrote:
> > Hello,
> > I have encountered some problems. I want to use speex to convert the
> > sampling rate (16000->48000).
> > When I read 640bytes each time, I found that the sound after the
> sound
> > conversion is very noisy,
> > but if I read 6400bytes each time. The conversion will be much
> better,
> > the line is my sample code, am I using it incorrectly? please
> help confirm?
> >
> > int main()
> > {
> > SpeexResamplerState *speex_resampler;
> > int err;
> > speex_resampler = speex_resampler_init(1, 16000, 48000, 10,
> &err);
> > FILE *fp = fopen("/data/zhou.wav", "rb+");
> > FILE *fp2 = fopen("/data/zhou2.wav", "ab+");
> > spx_int16_t inbuff[640] = {0};
> > spx_int16_t outbuff[1920] = {0};
> > spx_uint32_t inlen = 640;
> > spx_uint32_t outlen = 1920;
> > speex_resampler_skip_zeros(speex_resampler);
> > while (1)
> > {
> > int len = fread(inbuff, 2, 320, fp);
> > if (len <= 0)
> > {
> > break;
> > }
> > int ret = speex_resampler_process_int(speex_resampler,
> > 0,
> > inbuff,
> > &inlen,
> > outbuff,
> > &outlen);
> > printf("ret is %d\n", ret);
> > printf("outlen is %d\n",outlen);
> > fwrite(outbuff, 1, outlen, fp2);
> > }
> >
> > return 0;
> > }
> >
> >
> >
> >
> ------------------------------------------------------------------------
> > 以上
> > 如有问题,请联系我
> > mail zhouyuchen at iauto.com <mailto:zhouyuchen at iauto.com>
> > tel 1905
> >
>
More information about the Speex-dev
mailing list