Matlab 如何防止高频(泛音)产生

Matlab 如何防止高频(泛音)产生,matlab,audio,Matlab,Audio,我创建了一个波形文件(使用Matlab包含8khz到16khz的频率)。然后我播放波形,并使用M50麦克风(扬声器上方6厘米)和录音机(从扬声器)录制声音。最后,我使用一个matlab程序将声音转换成一个图形。在这个图形中,你可以看到一个8-16khz的平台(我想要的),但也可以看到一些高频分量(箭头)。我不知道为什么会产生高频(>16khz)。是扬声器中产生的高频信号,还是麦克风产生的噪音?谢谢。我认为您的问题在于使用linspace。从表面上看,它似乎应该可以工作,但您如何调用它却有些不舒服


我创建了一个波形文件(使用Matlab包含8khz到16khz的频率)。然后我播放波形,并使用M50麦克风(扬声器上方6厘米)和录音机(从扬声器)录制声音。最后,我使用一个matlab程序将声音转换成一个图形。在这个图形中,你可以看到一个8-16khz的平台(我想要的),但也可以看到一些高频分量(箭头)。我不知道为什么会产生高频(>16khz)。是扬声器中产生的高频信号,还是麦克风产生的噪音?谢谢。

我认为您的问题在于使用
linspace
。从表面上看,它似乎应该可以工作,但您如何调用它却有些不舒服。我认为你的方法并没有得到完全正确的采样率

此外,我对Matlab以一种普遍认可的格式输出24位WAV的能力几乎没有经验。我认为您应该先尝试16位,因为这对我来说非常可靠

因此,作为尝试,我将用以下方式重新编写您的代码:

Fs =44100;    
toneFreq1 = 8000; 
nSeconds = 25;  
f1 = sin(linspace(0, nSeconds*toneFreq1*2*pi, round(nSeconds*Fs)));
toneFreq2 = 8100; 
nSeconds = 25;  
f2 = sin(linspace(0, nSeconds*toneFreq2*2*pi, round(nSeconds*Fs)));
....

toneFreq80 = 15900; 
nSeconds = 25;  
f80 = sin(linspace(0, nSeconds*toneFreq80*2*pi, round(nSeconds*Fs)));
toneFreq81 = 16000; 
nSeconds = 25;  
f81 = sin(linspace(0, nSeconds*toneFreq81*2*pi, round(nSeconds*Fs)));


f_12345678910...= [f1+f2+f3+f4+f5+f6+f7+f8+f9+f10...f81]/81;


f_z=[f_12345678910...];
sound(f_z,Fs) 
wavwrite(f_z, Fs, 24, '8_16zKHz.wav');

您好,这里-您可以将图像放在另一个网站上并链接到此处,而不是发布您的电子邮件-有人可能会将其编辑到您的问题中。这里有一个好问题要问:是扬声器中产生了20KHz信号,还是麦克风产生了噪音?测试:用不同的频率生成两个以上的测试,并确保20KHz信号取决于您的代码,而不是取决于您的麦克风。TO:nkjt,Ander Biguri。谢谢你的建议,我已经编辑了我的问题并上传了数据。我还将尝试进行更多的测试。对于:Ander Biguri,我生成了两个声音(一个包含1-9khz,另一个包含12-20khz),我使用相同的测量值录制了一个.wav。然后我用同样的程序把.wav转换成一个数字,这两个数字的高频都不一样。那么这是否意味着代码(我使用的是8-16khz)有问题?你能提出一些想法吗?谢谢你。致奇波黛特:谢谢你的建议。
%define my parameters
toneFreqs = [8000:100:16000];
fs = 44100;
nSeconds = 25;

%create my data
t_sec = ([1:(nSeconds*fs)]-1)/fs; %here is the time for each sample
t_sec = t_sec(:);                 %make a column instead of a row
myWav = zeros(size(t_sec));       %pre-allocate the output
for Ifreq = 1:length(toneFreqs)   %loop over each frequency
    myWav = myWav + sin(2*pi*toneFreqs(Ifreq)*t_sec);
end

%save to WAV file
myWav = myWav./max(abs(myWav));    %normalize amplitude to 1.0
wavwrite(myWav,fs,16,'myWav.wav'); %save as 16 bit