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

时间:2014-11-04 08:36:39

标签: matlab audio

enter image description here

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');

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

1 个答案:

答案 0 :(得分:1)

我认为你的问题是使用linspace。从表面上看,它似乎应该有效,但是你如何调用它会有些不舒服。我认为你的方法最终没有完全正确的采样率。

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

所以,作为尝试的东西,我会以这种方式重新编写代码:

%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