"ファイルの書き込み​に際しデータが切り捨​てられました"と表示​される

24 Ansichten (letzte 30 Tage)
Kaede
Kaede am 12 Aug. 2020
Kommentiert: Kaede am 12 Aug. 2020
clear;
[p1,fs]=audioread('40kph_RN.wav');
[p2,fs]=audioread('2000rpm_Knock.wav');
fs=44100;
p2(448512,[1 2]) = [0,0];
%smix=30*p1+p2;
%soundsc(smix,fs)
%filename='mix.wav';
%audiowrite(filename,smix,fs);
Lch_p1=p1(:,1);
Rch_p1=p1(:,2);
Lch_p2=p2(:,1);
Rch_p2=p2(:,2);
smix_Lch=22*Lch_p1+Lch_p2;
%soundsc(smix_Lch,fs)
filename='mix_Lch.wav';
audiowrite(filename,smix_Lch,fs);
smix_Rch=22*Rch_p1+Rch_p2;
%soundsc(smix_Rch,fs)
filename='mix_Rch.wav';
audiowrite(filename,smix_Rch,fs);
fft_p1L=fft(22*Lch_p1);
dB_p1L=mag2db(abs(fft_p1L));
fft_p1R=fft(22*Rch_p1);
dB_p1R=mag2db(abs(fft_p1R));
fft_p2L=fft(Lch_p2);
dB_p2L=mag2db(abs(fft_p2L));
fft_p2R=fft(Rch_p2);
dB_p2R=mag2db(abs(fft_p2R));
f = (0:length(fft_p1L)-1)*fs/length(fft_p1L);
figure(1)
semilogx(f,dB_p2L)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1L)
grid on, hold off
legend('2000rpm.knock','roadnoise');
figure(2)
semilogx(f,dB_p2R)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1R)
grid on, hold off
legend('2000rpm.knock','roadnoise');
このようなプログラムを使用してディーゼルエンジンのガラガラといった音に走行騒音を重ねることでガラガラ音を聞こえにくくするという実験を行っています.そのためにLch_p1,Rch_p1に定数をかけます.1kあたりがガラガラ音になるのでこれを消そうとすると100ぐらいかける必要がありますが,"ファイルの書き込みに際しデータが切り捨てられました"と表示され,音が汚く音割れのような現象が起きます.これを防ぐ方法はありますでしょうか.
  1 Kommentar
Kaede
Kaede am 12 Aug. 2020
追加で質問なのですがデータが切り捨てられているということはこの作成した音は原音に忠実に作成されていないということでしょうか.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Kojiro Saito
Kojiro Saito am 12 Aug. 2020
こちらのドキュメントのとおり、audiowriteの書き込み対象のデータ型によって、書き込めるデータの範囲が変わってきます。上記の変数smix_Lchsmix_Rchのデータ型を確認してみてください。
whos smix_Lch
whos smix_Rch
このコマンドのクラスにデータ型が返ってきます。
もしデータ型がuint8の場合は0以上255以下、singleやdoubleの場合は、-1.0以上+1.0以下が書き込めるデータの範囲となります。これ以外の範囲になっていると、データが切り捨てられてしまうので、原音が忠実に作成されていないことになります。
audiowriteをやる前にデータを正規化して範囲に収まるようにしてみてください。
例えば、
smix_Lch = smix_Lch / max(smix_Lch);
audiowrite(filename,smix_Lch,fs);
とか、もしsmix_Lchがマイナスの値を取るなら
smix_Lch = smix_Lch / max(abs(smix_Lch));
audiowrite(filename,smix_Lch,fs);
とかでいかがでしょうか。
  1 Kommentar
Kaede
Kaede am 12 Aug. 2020
斎藤様いつもコメントありがとうございます.
承知いたしました.
先生に聞いたところロードノイズに定数をかけるのではなく,ガラガラ音を小さくしていくことで相対的にロードノイズを大きくできないかと言われましたのでそちらでも検討したいと考えております.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu MATLAB 入門 finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!