时域和频域
(1)什么是信号的时域和频域?
时域和频域是信号的基本性质,用来分析信号的 不同角度 称为 域 ,一般来说,时域的表示较为形象与直观,频域分析则更为简练,剖析问题更为深刻和方便。目前,信号分析的趋势是从时域向频域发展。然而,它们是互相联系,缺一不可,相辅相成的。
(2)时频域的关系是什么?
时域分析与频域分析是对模拟信号的两个观察面。对信号进行时域分析时,有时一些信号的时域参数相同,但并不能说明信号就完全相同。因为信号不仅随时间变化,还与频率、相位等信息有关,这就需要进一步分析信号的频率结构,并在频率域中对信号进行描述。动态信号从时间域变换到频率域主要通过傅立叶级数和傅立叶变换实现。周期信号的变换采用傅立叶级数,非周期信号的变换采用傅立叶变换。
(3)信号的时域和频域表达方式各有什么特点?
我们描述信号的方式有时域和频域两种方式,时域是描述数学函数或物理信号对时间的关系,而频域是描述信号在频率方面特性时用到的一种坐标系,简单来说,横坐标一个是时间,一个是频率。
一般正弦信号可由幅值、频率、相位三个基本特征值就可以唯一确定。但对于两个形状相似的非正弦波形,从时域角度,很难看出两个信号之间的本质区别,这就需要用到频域表达方式。
时域:自变量是时间,即横轴是时间,纵轴是信号的变化(振幅)。其动态信号x ( t ) x(t)x(t)是描述信号在不同时刻取值的函数。
频域:自变量是频率,即横轴是频率,纵轴是该频率信号的幅度(振幅),就是指的信号电压大小,也就是通常说的频谱图。
如下为测试音频的图谱
链接: pan.baidu.com/s/155QsNLLA… 提取码: ubh6
Python 图谱代码
# - * - coding: utf-8 - * -
import librosa
import librosa.display
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft
matplotlib.use('macosx')
plt.figure(dpi=600) # 将显示的所有图分辨率调高
matplotlib.rc("font",family='SimHei') # 显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 显示符号
def displayWaveform(): # 显示语音时域波形
"""
display waveform of a given speech sample
:param sample_name: speech sample name
:param fs: sample frequency
:return:
"""
samples, sr = librosa.load(r'/Users/yaoyajie/Desktop/test2.wav', sr=16000)
# samples = samples[6000:16000]
print(len(samples), sr)
time = np.arange(0, len(samples)) * (1.0 / sr)
plt.plot(time, samples)
plt.title("语音信号时域波形")
plt.xlabel("时长(秒)")
plt.ylabel("振幅")
plt.savefig("your dir\语音信号时域波形图", dpi=600)
plt.show()
def displaySpectrum(): # 显示语音频域谱线
x, sr = librosa.load(r'/Users/yaoyajie/Desktop/test2.wav', sr=16000)
print(len(x))
# ft = librosa.stft(x)
# magnitude = np.abs(ft) # 对fft的结果直接取模(取绝对值),得到幅度magnitude
# frequency = np.angle(ft) # (0, 16000, 121632)
ft = fft(x)
print(len(ft), type(ft), np.max(ft), np.min(ft))
magnitude = np.absolute(ft) # 对fft的结果直接取模(取绝对值),得到幅度magnitude
frequency = np.linspace(0, sr, len(magnitude)) # (0, 16000, 121632)
print(len(magnitude), type(magnitude), np.max(magnitude), np.min(magnitude))
print(len(frequency), type(frequency), np.max(frequency), np.min(frequency))
# plot spectrum,限定[:40000]
# plt.figure(figsize=(18, 8))
plt.plot(frequency[:40000], magnitude[:40000]) # magnitude spectrum
plt.title("语音信号频域谱线")
plt.xlabel("频率(赫兹)")
plt.ylabel("幅度")
plt.savefig("your dir\语音信号频谱图", dpi=600)
plt.show()
# # plot spectrum,不限定 [对称]
# plt.figure(figsize=(18, 8))
# plt.plot(frequency, magnitude) # magnitude spectrum
# plt.title("语音信号频域谱线")
# plt.xlabel("频率(赫兹)")
# plt.ylabel("幅度")
# plt.show()
def displaySpectrogram():
x, sr = librosa.load(r'/Users/yaoyajie/Desktop/test2.wav', sr=16000)
# compute power spectrogram with stft(short-time fourier transform):
# 基于stft,计算power spectrogram
spectrogram = librosa.amplitude_to_db(librosa.stft(x))
# show
librosa.display.specshow(spectrogram, y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('语音信号对数谱图')
plt.xlabel('时长(秒)')
plt.ylabel('频率(赫兹)')
plt.savefig("your dir\语音信号对数谱图11", dpi=600)
plt.show()
if __name__ == '__main__':
# displayWaveform()
# displaySpectrum()
displaySpectrogram()
iOS 音频采集效果影响参数
目前项目中使用的都是单通道,采样率8000,采样位数16,录音质量高
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[session setActive:YES error:&error];
//设置参数
NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:
//采样率 8000/11025/22050/44100/96000(影响音频的质量)
[NSNumber numberWithFloat: 8000.0],AVSampleRateKey,
// 音频格式
[NSNumber numberWithInt: kAudioFormatMPEG4AAC],AVFormatIDKey,
//采样位数 8、16、24、32 默认为16
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
// 音频通道数 1 或 2
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
//录音质量
[NSNumber numberWithInt:AVAudioQualityHigh],AVEncoderAudioQualityKey,
nil];
多通道如下效果