Wav文件到PCM数据的读取与保存方法

版权申诉
0 下载量 58 浏览量 更新于2024-10-08 收藏 1009B RAR 举报
资源摘要信息: "Wav.rar_wav 读 vc 数据_wav java_wav文件读取_保存wav_读取pcm数据" 标题中的关键词涉及了音频文件格式、编程语言和数据处理。具体来说,"Wav"指的是WAV音频文件格式,这是一种常用的音频文件格式,通常与微软的Windows操作系统关联,它记录了声音的数字表示,可以包含未压缩的PCM音频数据。"读vc数据"可能指的是在Visual C++(VC++)编程环境中读取数据。"wav java"可能表示使用Java语言来操作和处理WAV文件。"wav文件读取"和"保存wav"则是指在编程中读取和保存WAV文件的过程。"读取pcm数据"是指从WAV文件中提取或读取PCM(脉冲编码调制)数据。 描述中提到了两个关键的操作:读取WAV文件和将读取的数据保存为PCM格式的文件。这意味着需要进行音频文件解析和数据转换。PCM是一种未压缩的数字音频格式,它记录了数字音频信号的原始采样值,广泛用于数字音频编辑和音质要求较高的场合。 标签中包含了"Wav"、"读"、"vc"、"数据"、"wav_java"、"wav文件读取"、"保存wav"和"读取pcm数据"等关键词,这些关键词共同描绘了这个资源可能包含的内容,如使用C++和Java进行WAV和PCM文件处理。 压缩包子文件的文件名称列表中仅包含一个文件名"Wav.java",这表明在这个压缩包内,我们有一个用Java编写的类或程序,很可能与读取、处理WAV文件,以及将数据保存为PCM格式有关。 综合以上信息,我们可以构建一系列与WAV文件处理、PCM数据读取和Java编程相关的关键知识点: 1. WAV文件格式:WAV文件是音频文件的一种格式,通常使用PCM编码存储音频数据,它支持无压缩的音频录制和播放。在WAV文件中,音频数据通常被打包在一个名为"chunk"的结构中,其中包括了文件头(元数据)和数据块。 2. PCM数据:脉冲编码调制(PCM)是一种数字信号的表示方法,它将模拟信号(如声音波形)按照一定的采样率进行采样,将每个采样点的幅度值转换为相应的数字值。PCM数据常用于未压缩的音频文件。 3. C++与Java中的文件处理:在C++中读取WAV文件通常涉及到文件I/O操作,可能需要使用到如fstream或iostream库来打开、读取和写入文件。在Java中处理文件,可能使用File类和相关的I/O流类如FileInputStream和FileOutputStream。 4. 读取与保存文件:在程序中读取WAV文件时,需要从文件头中解析出音频参数(如采样率、声道数、位深等),然后从数据块中读取PCM数据。保存为PCM文件时,需要将这些数据按照PCM格式重新组织,并写入到新的文件中。 5. Java中的音频处理库:Java提供了高级的音频处理库,如javax.sound.sampled包,通过这个包可以方便地读取和播放音频文件,进行格式转换等。 6. WAV文件的读取算法:WAV文件通常包含一个文件头(RIFF头),后面跟着"fmt"和"data"块。读取算法需要先识别和解析RIFF头,然后找到"fmt"块,获取音频格式信息,接着定位"data"块,从这个块中读取PCM数据。 7. 编码转换与处理:在将WAV文件转换为PCM文件的过程中,需要确保格式正确无误,数据不被损坏。这可能涉及到对音频数据进行重采样或者重新编码的操作。 8. 跨平台音频处理:由于WAV和PCM都是广泛支持的格式,因此无论是在Windows(Visual C++环境)还是跨平台的Java环境,处理这些格式的程序都可以被设计成跨平台工作。 这个资源的使用场景可能涉及到音频编辑软件开发、音频格式转换工具、音乐播放器开发,以及任何需要在软件中对WAV文件进行读取和处理的场景。开发者通过这个资源可以学习如何在不同的编程语言和环境中操作音频数据,以及如何处理特定格式的音频文件。

下面给出一段代码:class AudioDataset(Dataset): def init(self, train_data): self.train_data = train_data self.n_frames = 128 def pad_zero(self, input, length): input_shape = input.shape if input_shape[0] >= length: return input[:length] if len(input_shape) == 1: return np.append(input, [0] * (length - input_shape[0]), axis=0) if len(input_shape) == 2: return np.append(input, [[0] * input_shape[1]] * (length - input_shape[0]), axis=0) def getitem(self, index): t_r = self.train_data[index] clean_file = t_r[0] noise_file = t_r[1] wav_noise_magnitude, wav_noise_phase = self.extract_fft(noise_file) start_index = len(wav_noise_phase) - self.n_frames + 1 if start_index < 1: start_index = 1 else: start_index = np.random.randint(start_index) sub_noise_magnitude = self.pad_zero(wav_noise_magnitude[start_index:start_index + self.n_frames], self.n_frames) wav_clean_magnitude, wav_clean_phase = self.extract_fft(clean_file) sub_clean_magnitude = self.pad_zero(wav_clean_magnitude[start_index:start_index + self.n_frames], self.n_frames) b_data = {'input_clean_magnitude': sub_clean_magnitude, 'input_noise_magnitude': sub_noise_magnitude} return b_data def extract_fft(self, wav_path): audio_samples = librosa.load(wav_path, sr=16000)[0] stft_result = librosa.stft(audio_samples, n_fft=n_fft, win_length=win_length, hop_length=hop_length, center=True) stft_magnitude = np.abs(stft_result).T stft_phase = np.angle(stft_result).T return stft_magnitude, stft_phase def len(self): return len(self.train_data)。请给出详细注释

2023-05-24 上传

下面给出一段代码:class AudioDataset(Dataset): def __init__(self, train_data): self.train_data = train_data self.n_frames = 128 def pad_zero(self, input, length): input_shape = input.shape if input_shape[0] >= length: return input[:length] if len(input_shape) == 1: return np.append(input, [0] * (length - input_shape[0]), axis=0) if len(input_shape) == 2: return np.append(input, [[0] * input_shape[1]] * (length - input_shape[0]), axis=0) def __getitem__(self, index): t_r = self.train_data[index] clean_file = t_r[0] noise_file = t_r[1] wav_noise_magnitude, wav_noise_phase = self.extract_fft(noise_file) start_index = len(wav_noise_phase) - self.n_frames + 1 if start_index < 1: start_index = 1 else: start_index = np.random.randint(start_index) sub_noise_magnitude = self.pad_zero(wav_noise_magnitude[start_index:start_index + self.n_frames], self.n_frames) wav_clean_magnitude, wav_clean_phase = self.extract_fft(clean_file) sub_clean_magnitude = self.pad_zero(wav_clean_magnitude[start_index:start_index + self.n_frames], self.n_frames) b_data = {'input_clean_magnitude': sub_clean_magnitude, 'input_noise_magnitude': sub_noise_magnitude} return b_data def extract_fft(self, wav_path): audio_samples = librosa.load(wav_path, sr=16000)[0] stft_result = librosa.stft(audio_samples, n_fft=n_fft, win_length=win_length, hop_length=hop_length, center=True) stft_magnitude = np.abs(stft_result).T stft_phase = np.angle(stft_result).T return stft_magnitude, stft_phase def __len__(self): return len(self.train_data)。请给出详细解释和注释

2023-05-24 上传