音频信号类型
1.输入信号为待测试模块发出的阶梯型频率的信号
我们通过声卡采集,采集到的信号如下图:
我们通过excel表格来显示文本数据比较明显:
该数据显示的是声卡采集出的音频的时域数据(采用的是pcm编码方式)
收到此类数据我们需要使用fft算法将时域数据转化为频域的数据
识别起始频点
被测物按照要求频率发声样例代码中的被测物发声的频率为[4000, 3550, 3150, 2800, 2500, 2240, 2000, 1800, 1600, 1400, 1250, 1120, 1000,900, 800, 710, 630, 560, 500, 450, 400, 355, 315, 280, 250, 224, 200, 180, 160, 140]单位为(Hz)
首先我们需要在声卡采集的数据中找到被测物的起始频点
函数如下:
def search_signal_start(signal):
expectedZCs = InputStartFreq * FrameSampleRate / SampleRate
maxZCgapAllowed = int(round(SampleRate / InputStartFreq)) + 1
zero_count = 0
maxZCgap = 0
sample_since_last_ZC = 0
frame_average = signal - np.mean(signal)
for i in range(1, len(signal)-1):
if frame_average[i] >= 0 and frame_average[i-1] < 0:
zero_count += 1
if sample_since_last_ZC > maxZCgap:
maxZCgap = sample_since_last_ZC
sample_since_last_ZC = 0
sample_since_last_ZC += 1
if np.abs(expectedZCs - zero_count) > 2 or maxZCgap > maxZCgapAllowed:
return False
else:
return True
其中变量的定义
InputStartFreq = 4000 #起始频点
InputEndFreq = 140 #结束频点
SampleRate = 48000 #声卡采样率
FrameSampleRate = 2048 音频数据采样样本数
我们通过"过0点"的数量来识别样本中的起始频点
音频数据fft转化
找到起始频点后将识别到的音频数据进行FFT运算
def fft(signal):
fourrier = np.fft.fft(signal)
n = signal.size
timestep = 1 / SampleRate
freq = np.fft.fftfreq(n, d=timestep)
return (freq, fourrier)
由此我们得到了频域上的数据,我们通过对频域数据的分析
得到被测物在这个频率上的数据(频响和谐波失真)