一、文件結構和格式
PCM(Pulse-code modulation)是一種音頻文件格式,它以數字形式存儲模擬聲音信號。PCM 格式的音頻文件包括一個頭文件和一個數據文件,其中頭文件描述了音頻數據的特性。這些特性包括採樣率、採樣深度、通道數和編碼格式。
下面是一個 PCM 文件頭的基本結構:
struct WAVE_HEADER {
char chunk_id[4]{ 'R', 'I', 'F', 'F' };
long chunk_size;
char format[4]{ 'W', 'A', 'V', 'E' };
char fmt_chunk_id[4]{ 'f', 'm', 't', ' ' };
long fmt_chunk_size;
short format_tag;
short channels;
long sample_rate;
long avg_bytes_sec;
short block_align;
short bits_per_sample;
char data_chunk_id[4]{ 'd', 'a', 't', 'a' };
long data_size;
PCM 文件頭部分包含 RIFF 標識、文件大小、WAVE 標識、fmt 標誌、fmt 區塊大小、音頻格式、通道數、採樣率、每秒位元組數、塊對齊位元組數、採樣精度、data 區塊標識符和數據區塊大小。
二、使用已有軟體打開PCM文件
使用已有軟體打開 PCM 文件非常容易,只需要雙擊文件或右鍵選擇「打開方式」,選擇一個合適的媒體播放器即可打開文件。有一些流行的媒體播放器,如 Windows Media Player、VLC 或 iTunes,都支持 PCM 格式文件的播放。這些軟體已經能夠識別 PCM 的文件格式和文件頭信息,能夠正確解析數據文件並播放其所含音頻內容。
以下是使用 Python 語言的 librosa 庫讀取 PCM 文件例子:
import librosa
filename = 'test.pcm'
y, sr = librosa.load(filename, sr=8000, mono=True, dtype='float32')
這段 Python 代碼使用 librosa 庫的 load 函數讀取文件 ‘test.pcm’ ,指定採樣率為 8000 Hz ,mono=True 表示採樣單通道音頻,dtype=’float32′ 表示返回的音頻數據類型為 float32。
三、使用自己編寫的程序打開PCM文件
如果想使用自己編寫的程序打開 PCM 文件,需要用到文件 I/O 機制,讀取文件頭和音頻數據。以下是使用 C++ 語言編寫的讀取 PCM 文件頭的示例:
#include <iostream>
#include <fstream>
#define FILENAME "test.pcm"
using namespace::std;
typedef struct WAVE_HEADER {
char chunk_id[4];
long chunk_size;
char format[4];
char fmt_chunk_id[4];
long fmt_chunk_size;
short format_tag;
short channels;
long sample_rate;
long avg_bytes_sec;
short block_align;
short bits_per_sample;
char data_chunk_id[4];
long data_size;
}WAVE_HEADER;
int main() {
ifstream pcmfile;
pcmfile.open(FILENAME, ios::binary);
WAVE_HEADER header;
pcmfile.read((char *)&header, sizeof(header));
cout << "Format: " << header.format << endl;
cout << "Channels: " << header.channels << endl;
cout << "Sample rate: " << header.sample_rate << endl;
pcmfile.close();
return 0;
}
這段 C++ 代碼打開 ‘test.pcm’ 文件,使用 ifstream 類型文件對象讀取文件頭部分內容,同時輸出 PCM 文件的格式,通道數和採樣率三個參數的值。
四、PCM文件預處理
由於 PCM 文件的數據文件通常較大,直接讀取可能會導致內存不足或讀取效率較低。在使用自己編寫的程序分析 PCM 文件之前,可能需要進行一些預處理,以減少數據量並提高讀寫效率。以下是一個簡單的 Python 代碼段,使用 librosa 庫將 PCM 文件處理成 Mel 頻譜信息,從而方便進行音頻信號分析和建模:
import librosa
import numpy as np
filename = 'test.pcm'
with open(filename, 'rb') as pcmfile:
pcmdata = np.frombuffer(pcmfile.read(), dtype='int16')
pcmdata = pcmdata.astype(np.float32)
pcmdata /= np.iinfo(np.int16).max
#預加重
pcmdata = librosa.preemphasis(pcmdata)
#進行短時傅里葉變化
stft = librosa.core.stft(pcmdata, hop_length=512, n_fft=2048)
#進行Mel變換
mel_basis = librosa.filters.mel(sr=8000, n_fft=2048, n_mels=80)
mel = np.dot(mel_basis, np.abs(stft)**2)
#取log ,使數據更加穩定
mel = librosa.core.amplitude_to_db(mel)
這段 Python 代碼打開文件 『test.pcm』 ,讀取文件內容,進行預加重處理,然後將其轉換為浮點數形式,並進行短時傅里葉變換和 Mel 變換。 最後取log,製作 Mel 頻譜信息。
五、結論
本文從文件格式和結構、使用已有軟體、使用自己編寫的程序、 PCM 文件預處理等多個方面介紹了 PCM 文件怎麼打開。通過雙擊或使用 Python 語言的 librosa 庫,我們可以方便地打開 PCM 文件並讀取相關信息。 使用 C++ 或 Python 語言編寫自己的程序,可以更靈活地處理 PCM 數字音頻信號並進行相應的信號處理。
原創文章,作者:ICNNJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333451.html